Pregunta

Puede alguien por favor me la escuela en la forma correcta de cargar una jerarquía de vistas de un archivo semilla. Estoy utilizando la vista cargada como una plantilla para acabar con una familia de puntos de vista y el enfoque actual que estoy usando es sutilmente roto. No parecen ser copia-ción o retener-ción cuando debería ser. Aquí está el código correspondiente:

// pageSet is a list of view tag numbers I'll be using
for (NSNumber *n in pageSet) {

    NSUInteger viewTag = [n integerValue];

    // Ingest the nib. Should there be a copy or retain here?
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"RandomStripe" owner:self options:nil];

    // Pull the view from the nib. Should there be a copy or retain here?
    MyView *view = (MyView *)[topLevelObjects objectAtIndex:0];

    // The view has a label as it's subview
    UILabel *pageNumberLabel = [view.subviews objectAtIndex:0];
    pageNumberLabel.text     = [NSString stringWithFormat:@"%d", viewTag];

    CGFloat xOffset = ((float) viewTag) * self.scrollView.bounds.size.width;

    view.frame = CGRectMake(xOffset, 0, self.scrollView.bounds.size.width, self.scrollView.bounds.size.height);
    view.tag = viewTag;

    // Insert the view as a child of my containerView
    [self.containerView addSubview:view];

} // for (pageSet)

Esto ha estar haciendo me dolía la cabeza, mientras que para ahora?

Cheers, Doug

¿Fue útil?

Solución

Si utiliza IBOutlets desde dentro Interface Builder de nuevo a su código, lo que sería un poco más fácil. De esa manera, tan pronto como se intenta acceder a la toma de UIView que haya configurado, que se carga, con todos sus hijos, y luego se llamará initWithCoder del UIView (útil si ha subclase él).

@property (retain, nonatomic) IBOutlet iiView   *iiView;

De lo contrario, hago esto:

if (self.numberView == nil) {
    NumberView  *numView = [[NumberView alloc] initWithNibName:@"NumberView" bundle:[NSBundle mainBundle]];
    self.numberView = numView;
    [numView release];
}

(Con una IBOutlet para numberView, sólo seguir adelante y comenzar a usar numberView en lugar del código anterior)

En ambas condiciones, todos los subvistas - los niños - de numberView obtendrá cargado al mismo tiempo. Si necesitaba acceder a una etiqueta o un botón que haría un IBOutlet para aquellos también, así que no voy a tener que atravesar la jerarquía de vistas en busca de ellos.

IBOutlet UIButton *nextButton,
          *stopButton1,
          *stopButton2,
          *infoButton,
          *bitsonthegoButton;
IBOutlet UILabel *pointsLabel1,
         *pointsLabel2,
         *totalPointsLabel1,
         *totalPointsLabel2;

Otros consejos

No estaba segura de si la otra respuesta fue muy claro en este punto, pero ningún IBOutlets que ha configurado en su vista a conseguir con cable con el mismo loadNibNamed: llama que está haciendo hoy en día. Así que en la cabecera de ese punto de vista, que le declara IBOutlets tanto para myView y pageNumberLabel, luego adjuntarlos en propietario del archivo en el xib (y ajuste de Tipo de archivo propietario de ser el punto de vista que está llamando loadNibNamed: desde).

Eso es sólo para hacer su vida más fácil. Para responder a la pregunta que hizo, la documentación para "loadNibNamed: Propietario: opciones" nos dice:

  

Debe conservar bien el vuelto   matriz o los objetos que contiene   manualmente para evitar que el archivo semilla   objetos de ser liberado   prematuramente.

Así que la matriz se autoreleased, y todos los objetos que son así (que se puede esperar de una llamada devuelve una matriz autoreleased). Puesto que usted quiere mantener la vista en la que retendría que - al hacerlo significaría ningún subvistas de la vista principal se mantendrían en torno a su vez, desde una vista retendrá nada establecido como una vista secundaria. Si también retuvo la etiqueta que podría causar una fuga cuando la soltó la vista principal a menos que también libera la etiqueta al mismo tiempo (pero no parece haber ninguna razón para hacer eso).

Sin embargo tenga en cuenta que cuando digo "retener la vista", que ya está haciendo lo que en el código que envió, añadiendo simplemente como un subvista a la vista de contenedores - como se ha señalado la vista conserva subvistas. MyView se dará a conocer si alguna vez retirado de la vista secundaria, por lo que querría retenerlo si lo hace por cualquier razón y quiere que mantiene entorno.

Semilla de gestión de memoria de carga parece complejo al principio, pero las reglas son en realidad mucho más simple de lo que parece.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top