2012-01-04 21 views
6

Ho una vista personalizzata a cui è necessario aggiungere un paio di visualizzazioni secondarie a livello di codice. Qual è il posto migliore per creare e aggiungere queste sottoview? Apple docs dicono:Dove chiamare [self addSubView]?

Se la classe di visualizzazione gestisce uno o più integrali subviews, effettuare le seguenti operazioni: Creare quelle subviews durante la sequenza di inizializzazione del punto di vista.

Questo è un po 'poco chiaro per me. Devo gestirlo in initWithFrame, initWithCoder o altrove?

Nota che non sto parlando di controller qui, questa è una vista che deve inizializzarsi.

risposta

9

initWithFrame è il metodo che si chiama per creare un UIView a livello di codice, mentre initWithCoder viene chiamato quando un UIView viene instanciato da un XIB.

Quindi tutto dipende da come verrà creata la vista contenente. un modo per coprire tutti i casi:

- (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

Un modo alternativo per creare le viste (container e sottoview) da un singolo NIB. – Vinzzz

+0

Grazie, sembra buono. – georg

0

Generalmente, è necessario creare la vista e [autoadSubView] in viewdidload/viewwillappear del controllore della vista genitore se si desidera mostrare la vista tutto il tempo. È anche possibile impostarlo nascosto se si wih. In qualche altro scenario come se si desidera mostrare una vista su un clic del pulsante o su altre azioni, è necessario aggiungere di conseguenza le visualizzazioni secondarie.

+0

Leggere più attentamente! Sta parlando di una vista che ha bisogno di creare/aggiungere le proprie sottoview. Questo completamente non correlato per visualizzare i controller! –

0

Per integrale, significano importanti o massicci. viewDidLoad funziona bene, ma per cose veramente grandi o importanti, i metodi di inizializzazione sono la strada da percorrere.

3

procedere come segue: prendere il metodo a seconda di quale è l'inizializzatore designato per la visualizzazione. Cioè, è il metodo init più configurabile (cioè più argomenti) che ogni altro inizializzatore chiama. Ad esempio, può essere -initWithFrame: come più comunemente. Quindi implementare questo metodo come segue:

- (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

Grazie mille! .. – georg

+0

Nessun problema, puoi per favore acept se davvero aiutato? –

+1

Ho accettato un'altra risposta poiché fornisce più codice "di riferimento". Accetterei anche il tuo se potessi. – georg