2012-01-04 10 views
6

Tengo una vista personalizada a la que necesito agregar un par de subvistas mediante programación. ¿Cuál es el mejor lugar para crear y agregar estas subvistas? Apple docs dicen:¿Dónde llamar a [self addSubView]?

Si la clase de vista gestiona una o más integrales subvistas, haga lo siguiente: Crear esos subvistas durante la secuencia de inicialización de su vista.

Esto no está nada claro para mí. ¿Debo manejar eso en initWithFrame, initWithCoder o en otro lugar?

Tenga en cuenta que no estoy hablando de controladores aquí, esta es una vista que debe inicializarse.

Respuesta

9

initWithFrame es el método que llama para crear un UIView mediante programación, mientras que se llama a initWithCoder cuando se instancia un UIView desde un XIB.

Así que todo depende de cómo va a crear su vista contenedora. una manera de cubrir todos los casos:

- (id) initWithFrame:(CGRect)frame 
{ 
    if ((self = [super initWithFrame:frame])){ 
     [self setUpSubViews]; 
    } 
    return self; 
} 

- (id) initWithCoder:(NSCoder*)aDecoder 
{ 
    if ((self = [super initWithCoder:aDecoder])){ 
     [self setUpSubViews];//same setupv for both Methods 
    } 
    return self; 
} 

- (void) setUpSubViews 
{ 
    //here create your subviews hierarchy 
} 
+0

Una alternativa para crear sus vistas (contenedor y subvistas) desde un único NIB. – Vinzzz

+0

Gracias, eso se ve bien. – georg

0

Generalmente, debe crear la vista y [self addSubView] en viewdidload/viewwillappear del controlador de vista principal si desea mostrar la vista todo el tiempo. También puedes configurarlo si lo deseas. En otro escenario como el que desea mostrar una vista en un clic de botón o algunas otras acciones, debe agregar las subvistas en consecuencia.

+0

¡Lea más detenidamente! Él está hablando de una vista que necesita crear/agregar sus propias subvistas. ¡Esto está completamente relacionado con los controladores de vista! –

0

Por integral, significa importante o masivo. viewDidLoad funciona bien, pero para cosas realmente grandes o importantes, los métodos de inicialización son el camino a seguir.

3

Haz lo siguiente: tomar el método que sea el inicializador designado para su vista. Es decir, es el método de inicio más configurable (es decir, la mayoría de los argumentos) ... que cualquier otro inicializador llama. Por ejemplo, puede ser -initWithFrame :, como lo más comúnmente. A continuación, implemente este método de la siguiente manera:

- (id) initWithFrame:(CGRect)frame { 
    if ((self = [super initWithFrame:frame])) { 
     // add new views here, for example: 
     UIImageView *imageView = [[UIImageView alloc] initWithImage:anImage]; 
     [self addSubview:imageView]; 
     [imageView release]; 
    } 
    return self; 
} 
+0

¡Muchas gracias! ... – georg

+0

No hay problema, ¿puede aceptar si realmente lo ayudó? –

+1

He aceptado otra respuesta ya que proporciona más código de "referencia". Yo también aceptaría el tuyo si pudiera. – georg