2012-08-31 11 views
7

Estoy tratando de completar una vista de desplazamiento con una cantidad de subvistas idénticas, excepto los cambios de datos. Si quiero hacer todo el trabajo de manera programática, puedo hacerlo así:iOS: cómo crear vistas de forma programática utilizando XIB, pero sin usar View Controller

int width = 110; 
int count = 0; 
self.scrollView.contentSize=CGSizeMake(width*[items count],100); 

for (NSString *id in items) { 
    Item *item = [items objectForKey:id]; 
    CGRect frame = CGRectMake(count*width, 0, 100, 100); 
    UIView *itemSubview = [[UIView alloc] initWithFrame:frame]; 

    CGRect dataLabelFrame = CGRectMake(0, 52, 35, 30); 
    UILabel* dataLabel = [[UILabel alloc] initWithFrame: dataLabelFrame]; 
    dataLabel.text = @"Data specific to item"; // item.property or something 
    dataLabel.font:[UIFont systemFontOfSize:30]; 
    dataLabel.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0]; 

    [itemSubview addSubview:dataLabel]; 
    [self.scrollView addSubview:itemSubview]; 
    [itemSubview release]; 
} 

Todo bien. Ahora, ¿cómo hago lo mismo si mi subView es un poco más complejo, y quiero diseñarlo con Interface Builder y un archivo xib? Hasta ahora tengo:

  • creado mi propio código vista personalizada, ItemSubview, extendiéndose UIView con un
  • creado mi archivo xib IBOutlet NSString * DATALABEL, configure el propietario del archivo a ser de ItemSubview clase, y puse en mi etiqueta para la toma de

entonces, en código:

int width = 110; 
int count = 0; 
self.scrollView.contentSize=CGSizeMake(width*[items count],100); 

for (NSString *id in items) { 
    Item *item = [items objectForKey:id]; 
    CGRect frame = CGRectMake(count*width, 0, 100, 100); 
    ItemSubview *itemSubview = [[ItemSubview alloc] initWithFrame:frame]; 
    [itemSubview setBackgroundColor:[UIColor colorWithRed:0.0 green:0.2 blue:0.0 alpha:0.2]]; // to see where it ends up 

    [[NSBundle mainBundle] loadNibNamed:@"ItemSubview" owner:itemSubview options:nil]; 
    itemSubview.dataLabel.text = @"Data specific to item"; // item.property or something 
    [self.scrollView addSubview:itemSubview]; 
    [itemSubview release]; 
} 

Cuando hago esto, mi itemSubview ve arrastrado (puedo ver el color de fondo de la itemSubview), pero no el dataLabel que estaba en el archivo xib. ¿Qué estoy perdiendo/no entendiendo? ¿Por qué funciona esto programáticamente, pero no con un archivo xib?

Respuesta

8

hacerlo de esta manera:

NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"ItemSubview" owner:self options:nil]; 
    ItemSubview *itemSubview = [topLevelObjects objectAtIndex:0]; 

Asegúrese de que en su archivo xib, la vista de nivel superior es de la clase ItemSubview, y que DATALABEL está conectado correctamente a la toma de ItemSubview. El propietario del archivo debe dejarse en blanco.

+0

Eso ayudó. El itemSubview salió del xib con el fondo y el tamaño, pero aún no mostraba su subvista secundaria de etiqueta de datos. (Ni siquiera el valor predeterminado establecido en xib). El propietario del archivo está en blanco, y la salida de dataLabel está conectada a itemSubview (que es el único objeto de nivel superior en el xib). El depurador dice que la etiqueta está allí, con el valor correcto, pero no aparece en la pantalla. Hmmm ... – meriial

+0

Eso es extraño. Noté que escribió que la clase ItemSubview tiene un IBOutlet que es un NSString *. ¿No debería ser eso un UILabel *? Creo que probablemente sea solo un error en la pregunta. Podría intentar esto: elimine el archivo xib por completo, reinicie Xcode y vuelva a crear el archivo xib. En algún momento, Xcode se arruina. Aparte de eso, tal vez publique el código exacto que está utilizando para agregar las subViews, la clase ItemSubview y una imagen de su archivo xib configurado. – Darren

+0

Mi problema, resultó ser que era la [publicación de ItemSubview]. Entonces, con eso eliminado, todo está bien. – meriial

Cuestiones relacionadas