iphone ios uiview interface-builder nib

iphone - Cargando UIView personalizado desde la punta, todas las subvistas contenidas en la punta son nulas?



ios interface-builder (2)

Tengo un objeto UIView personalizado con una nib que define el diseño de vista / subvista. Mis salidas están conectadas, y cuando inicio el objeto desde initWithFrame: todo está en orden.

El problema que tengo es cuando uso IB para incrustar UIView en otra punta; Aparece la vista UIView personalizada, pero no aparece ninguna de las subvistas que contiene; de ​​hecho, todos sus símbolos se resuelven en cero. Tengo un initWithCoder: muy mínimo initWithCoder: y awakeFromNib: implementación (solo hace el registro) y mi entendimiento es que a medida que se deserializa la pluma, las subvistas deberían al menos inicializarse durante el proceso.

La única conclusión a la que llego por mi cuenta es que está sucediendo una de dos cosas: o bien mis referencias de salida están corruptas / malas y no funcionan, o mi comprensión del proceso de carga desde la punta es errónea y estoy Echando de menos algo.

¡Gracias por adelantado!

Edición: (Código publicado para Nekto según lo solicitado ... como verás, se registra y eso es todo, jeje.)

- (id)initWithCoder:(NSCoder *)aDecoder { if ((self = [super initWithCoder:aDecoder])) { NSLog(@"ThumbnailGridView.initWithCoder frame= %f, %f", self.frame.size.width, self.frame.size.height); } return self; } - (void)awakeFromNib { NSLog(@"ThumbnailGridView:awakeFromNib"); }

Edición 2: Nibs, controladores, subvistas, etc.

Nibs: Tengo una única punta que contiene un UIView. Esta vista UIV contiene un solo UIScrollView, que se rellena con una cuadrícula de vistas UIV que se definen en otra punta. (Nota: esta parte funciona bien, ya que el relleno se realiza mediante programación y funciona con una llamada initWithFrame:). El problema aquí es que el símbolo UIScrollView es nulo después de initWithCoder: y awakeFromNib: se llaman, así que los objetos se están agregando a Nada y nada pasa. Si el símbolo de scrollview no fuera nulo, estoy seguro de que esto funcionaría.

Controladores: hay dos controladores que utilizan esto, uno se hace con initWithFrame: y funciona perfectamente, el otro lo incorpora como una referencia basada en plumillas. (Como se mencionó en otra parte aquí, definiendo una vista UIV en IB, configurando la clase personalizada). Recorrí el código y esa vista, que se está inicializando correctamente, solo sus subvistas "faltan".

¿Esto ayuda a dar una imagen más clara de la situación?


Es posible que no entienda bien cómo funciona la carga de plumillas. Si define una UIView personalizada y crea un archivo de punta para diseñar sus subvistas, no puede simplemente agregar una UIView a otro archivo de punta, cambie el nombre de la clase en IB a su clase personalizada y espere que el sistema de carga de la punta lo resuelva. Debe modificar el initWithCoder de su clase UIView personalizada para cargar mediante programación la punta que define su diseño de subvista. p.ej:

- (id)initWithCoder:(NSCoder *)aDecoder { if (self = [super initWithCoder:aDecoder]) { [[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self options:nil]; [self addSubview:self.toplevelSubView]; } return self; }

El archivo de punta de su vista personalizada necesita tener la clase ''Propietario del archivo'' establecida en su clase de vista personalizada y usted necesita tener una salida en su clase personalizada llamada ''toplevelSubView'' conectada a una vista en su archivo de vista personalizada que funciona como un Contenedor para todas las subvistas. Agregue puntos de venta adicionales a su clase de vista y conecte las subvistas al ''propietario del archivo'' (su UIView personalizado).

Alternativamente, simplemente cree su vista personalizada programáticamente y omita IB.


Verifique que está llamando a la implementación ''super'' de initWithCoder: y awakeFromNib en cada uno de sus métodos sobrescritos, es decir

- (id)initWithCoder:(NSCoder *)decoder { if ((self = [super initWithCoder:decoder])) { ...your init code... } return self; } - (void)awakeFromNib { [super awakeFromNib]; ...your init code... }