Tengo una clase llamada MyClass
que es una subclase de UIView
, que quiero inicializar con un XIB
archivo. No estoy seguro de cómo inicializar esta clase con el archivo xib llamadoView.xib
class MyClass: UIView {
// what should I do here?
//init(coder aDecoder: NSCoder) {} ??
}
Respuestas:
Probé este código y funciona muy bien:
Inicialice la vista y úsela como a continuación:
O
ACTUALIZACIÓN Swift> = 3.xy Swift> = 4.x
fuente
var view = MyClass.instanceFromNib()
&self.view.addSubview(view)
en oposición avar view = MyClass.instanceFromNib
&self.view.addSubview(view())
. Solo una pequeña sugerencia para mejorar la respuesta :)La solución de Sam ya es excelente, a pesar de que no tiene en cuenta diferentes paquetes (NSBundle: forClass viene al rescate) y requiere una carga manual, también conocido como código de mecanografía.
Si desea soporte completo para sus tomas Xib, diferentes paquetes (¡use en marcos!) Y obtenga una buena vista previa en Storyboard intente esto:
Use su xib como de costumbre, es decir, conecte los tomacorrientes al propietario del archivo y establezca la clase del propietario del archivo en su propia clase.
Uso: simplemente subclasifique su propia clase View desde NibLoadingView y configure el nombre de la clase como Propietario del archivo en el archivo Xib
No se requiere código adicional más.
Créditos donde vence el crédito: Bifurcó esto con cambios menores de DenHeadless en GH. Mi esencia: https://gist.github.com/winkelsdorf/16c481f274134718946328b6e2c9a4d8
fuente
nibSetup
desdeinit?(coder:)
causará una recursión infinita si se incrustaNibLoadingView
en un XIB..clearColor()
después de cargarlo desde el guión gráfico. Pero debería funcionar si lo hace por código después de que se instancia. De todos modos, como se dijo, un enfoque aún más elegante es el basado en el protocolo. Así que seguro, aquí hay un enlace para usted: github.com/AliSoftware/Reusable . Estoy usando un enfoque similar ahora con respecto a UITableViewCells (que implementé antes de descubrir ese proyecto realmente útil). hth!A partir de Swift 2.0, puede agregar una extensión de protocolo. En mi opinión, este es un mejor enfoque porque el tipo de retorno es
Self
más queUIView
, por lo que la persona que llama no necesita emitir a la clase de vista.fuente
var myView = nib.instantiate... as! myViewType
Swift 3
(XCode 8.0 beta 6) sin problemas. El error tipográfico estaba adentroSwift 2
. ¿Por qué debería ser otra respuesta cuando esta respuesta es buena y los usuarios probablemente quieran buscar cuáles son los cambios cuando usarán XC8Y esta es la respuesta de Frederik en Swift 3.0
fuente
Manera universal de cargar la vista desde xib:
Ejemplo:
Implementación:
fuente
Respuesta de Swift 3: en mi caso, quería tener una salida en mi clase personalizada que pudiera modificar:
Cuando esté en .xib, asegúrese de que el campo Clase personalizada sea MyClassView. No te molestes con el propietario del archivo.
Además, asegúrese de conectar la salida en MyClassView a la etiqueta:
Para instanciarlo:
fuente
Swift 4
Aquí, en mi caso, tengo que pasar datos a esa vista personalizada, por lo que creo una función estática para instanciar la vista.
Crear extensión UIView
Crear MyCustomView
Establezca la clase personalizada en MyCustomView en el archivo .xib. Conecte el tomacorriente si es necesario como de costumbre.
Vista de instancia
fuente
fuente