UIView.addSubview utilizando una vista cargada con NIB solo agrega UIView raíz

Externalice un componente en un file XIB para que pueda volver a utilizarlo en varias vistas diferentes. Ahora, en mi controller de vista, cargo la UIView basada en XIB y la agrego a la vista actual a través de:

NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"ThumbsPreviewView" owner:self options:nil]; _likePreview = [views objectAtIndex:0]; [self.view addSubview:_likePreview]; 

Al principio, pensé que no funcionaba … pero en realidad funciona pero solo pongo a mi vista la vista raíz (es decir, el contenedor de todos mis componentes charts, que es transparente).

Por lo tanto, necesito poner este tipo de código (para cada subcomponente) para que funcione:

 [self.view addSubview:_likePreview]; NSArray *subviews = _likePreview.subviews; for(UIView * subview in subviews) { [self.view addSubview:subview]; } 

Esto es muy contrario a la intuición, y además creo que no crea la jerarquía de vista que me gustaría.

Estoy seguro de que hay una solución porque hice el mismo tipo de cosa en un UITableViewController para cargar un encabezado de tabla personalizado de un XIB. Usar exactamente el mismo file XIB en esta situación carga todo correctamente. Aquí está el código:

 -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { switch(section) { case 0: { NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"ThumbsPreviewView" owner:self options:nil]; _likePreview = [views objectAtIndex:0]; return _likePreview; } } return [super tableView:tableView viewForHeaderInSection:section]; } 

Con el código anterior, todo está bien, obtuve la vista completa (= contenedor de vista raíz con todo su contenido) como encabezado de la sección de mi tabla.

Entonces, la pregunta es: ¿qué estoy haciendo mal en mi primer ejemplo? ¿Cómo puedo agregar todo el contenido (contenedor + todo el contenido) a mi padre UIView como una jerarquía UIView adecuada?

EDIT: Necesito precisar que todo está organizado en mi file XIB en una única UIView raíz, de la siguiente manera (no puedo publicar la image):

 * Thumbs preview view |_ Button |_ Image View |_ Image View |_ Image View |_ Image View |_ Button |_ Button |_ Button |_ Label 

Muchas gracias por su ayuda !

Christophe

Una forma de cargar su componente es almacenar sus componentes en un object superior UIView (s., Captura de pantalla adjunta).

http://a1.img.mobypicture.com/fd182b5ba5c55fa1fba9162f395ddb98_full.jpg

A continuación, puede cargar su plumín como de costumbre y usar -addSubview: para agregar sus componentes a la jerarquía de la vista.

EDITAR:

Cargando la punta con

 UIView *view = [[[NSBundle mainBundle] loadNibNamed:@"testView" owner:self options:nil] objectAtIndex:0]; 

y agregando la vista a la jerarquía de vista con

 [self.view addSubview:view]; 

conduce a la siguiente vista hiearchy:

 (lldb) po [[self view] recursiveDescription] (id) $1 = 0x088487b0 <UIView: 0x89595b0; frame = (0 0; 320 548); autoresize = W+H; layer = <CALayer: 0x8958b30>> | <UIView: 0x89755c0; frame = (0 0; 320 200); autoresize = RM+BM; layer = <CALayer: 0x8975080>> | | <UIView: 0x8975620; frame = (200 20; 100 30); autoresize = W+H; layer = <CALayer: 0x8975680>> | | <UIView: 0x8975700; frame = (20 20; 100 30); autoresize = W+H; layer = <CALayer: 0x8974ea0>> | | <UIRoundedRectButton: 0x8975790; frame = (20 58; 73 44); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x8975890>> | | | <UIGroupTableViewCellBackground: 0x8976030; frame = (0 0; 73 44); userInteractionEnabled = NO; layer = <CALayer: 0x8976100>> | | | <UIImageView: 0x89768d0; frame = (1 1; 71 43); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x89770f0>> | | | <UIButtonLabel: 0x8977af0; frame = (36 22; 0 0); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x8977be0>> | | <UIRoundedRectButton: 0x8978990; frame = (227 58; 73 44); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x8978a60>> | | | <UIGroupTableViewCellBackground: 0x8978a90; frame = (0 0; 73 44); userInteractionEnabled = NO; layer = <CALayer: 0x8978b10>> | | | <UIImageView: 0x8978b80; frame = (1 1; 71 43); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x8979230>> | | | <UIButtonLabel: 0x8978be0; frame = (36 22; 0 0); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x8978cd0>>