with from custom creating create ios uiview xib nib initwithcoder

ios - from - Cargue UIView personalizado con XIB desde la vista de un Controlador de Vista usando IB



init xib swift 4 (2)

Tengo una UIView personalizada ( MyCustomUIView ) que está construida usando Interface Builder. Me gustaría colocar esta vista personalizada en la vista de MyViewController , que también está diseñada con IB. He colocado una UIView como subvista en el MyViewController de MyViewController y he configurado su clase en MyCustomUIView . El problema es que cuando ejecuto el código, solo aparece una vista en blanco. (Cuando MyCustomUIView en el código, se muestra bien).

Solo initWithFrame: método initWithFrame: la siguiente manera en MyCustomUIView.m :

- (id)initWithFrame:(CGRect)frame { [[NSBundle mainBundle] loadNibNamed:@"MyCustomUIView" owner:self options:nil]; self = self.view; return self; }

¿Qué debo hacer para que la vista se cargue correctamente? ¿Cómo debería initWithCoder: ?


No coloque nada en la parte de vista del controlador de vista en IB. En su lugar, configure el nombre de la lista para el controlador de vista en IB con el nombre de la punta que contiene la vista. En la punta que contiene la vista, establezca el propietario del archivo en la clase de controlador de vista y conecte su propiedad de view a la vista.

El resultado será que cuando se crea una instancia del controlador de vista, si se crea una instancia desde el plumín (que no has probado es lo que realmente va a suceder, pero digamos que sí), encontrará el plumín y cargará la vista desde eso.

Básicamente, la regla es que no importa de dónde venga un controlador de vista, pasará por los mismos pasos buscando su vista en el mismo orden, como explico en mi libro:

http://www.apeth.com/iOSBook/ch19.html#_view_controller_and_view_creation

y en esta transmisión web:

http://www.youtube.com/watch?v=zIufcKpDIRo


Estás en lo correcto. IB usa initWithCoder. initWithCoder debería verse muy similar a tus otros métodos init:

- (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { // CUSTOM INITIALIZATION HERE } return self; }

Una vez que asigne su clase dentro de IB, no necesitará crear una instancia del paquete a menos que no esté entendiendo correctamente su intención.