2011-11-13 11 views
6

Sono nuovo per iOS5 e storyboarding.iOS5: Confusione con loadview e init e variabili di istanza

Ho notato che se dichiaro variabili di istanza all'interno del mio file viewcontroller .h e imposto i valori all'interno del mio file init del mio viewcontroller, quando viene visualizzata la vista del viewcontroller, le variabili di istanza mostrano null all'interno di viewDidLoad . Per poter ottenere myvariables, avrei bisogno di fare [self init] all'interno di viewDidLoad. Le mie domande sono:

@interface tableViewController : UITableViewController 
{ 
NSMutableArray *myvariable; 
} 
@end 

@implementation tableViewController 
-(id)init 
{ 
myvariable = [[NSMutableArray alloc]initWithObjects:@"Hi2",@"Yo2",@"whatsup2", nil]; 
} 

- (void)viewDidLoad 
{ 
NSLog(@"%@",myvariable); // DISPLAYS NULL 
[super viewDidLoad]; 
} 
  1. Perché non è la mia variabili disponibili in viewDidLoad quando ho dichiarato e realizzato nel mio file .he .m?
  2. Se è il caso, viewDidLoad o viewWillAppear i punti comuni per caricare i dati per il viewcontroller?
  3. Sembra che anche quando si istanzia un viewcontroller e si richiami la funzione init, viewDidLoad non ha necessariamente le variabili da visualizzare.
  4. Dov'è il posto giusto/i metodi per caricare il modello (dati) per il mio viewcontroller?

Grazie in anticipo

risposta

14

Quindi, per rispondere alla tua prima domanda, l'inizializzatore che si chiama in questo caso è initWithCoder :, non init. Quindi, se si sposta l'inizializzazione di NSArray su initWithCoder: si dovrebbe scoprire che è disponibile prima che la vista venga caricata.

Non dimenticare che è necessario chiamare anche l'inizializzatore della superclasse. Quindi, un modello come questo funzionerà:

-(id)initWithCoder:(NSCoder *)aDecoder { 

    if ((self = [super initWithCoder:aDecoder])) { 

     // initialize what you need here 
    } 

    return self; 

} 

Si riceverà anche awakeFromNib chiamato dopo initWithCoder: e dopo aver collegato tutte le prese, quindi se il vostro inizializzazione dipende dai punti di essere popolato, poi ci è l'opportunità di fare quell'inizializzazione lì.

E poi, naturalmente, si hanno viewDidLoad e viewWillAppear:. Non so che esiste una risposta generale al metodo "giusto" da usare (domande 2 e 4). Dipende da quanti dati hai, quanto spesso deve essere aggiornato e quanto tempo ci vuole per caricare. La mia opinione è che questa è una decisione da prendere per ogni caso.

Per la domanda n. 3, hai un esempio di ciò che hai visto lì? L'inizializzatore sarà sicuramente chiamato prima di viewDidLoad. Il trucco è sapere quale inizializzatore viene chiamato.

Ricordare che viewDidLoad può essere chiamato più volte durante la vita del controller di visualizzazione. Quindi preparati per quello. E ovviamente viewWillAppear: è ancora più probabile che venga chiamato più volte nel corso della vita del tuo controller di visualizzazione.

Spero che questo aiuti.

+0

HI Firoze, Grazie per la risposta. initWithCoder è sicuramente la funzione giusta per chiamare, Tutti i viewcontroller chiamano sempre initWithCoder. Qual è la differenza tra la mia istanza variabile in initWithCoder, initWithNibName e init?Significa che quando eseguo SomeViewController * test = [[SomeViewController alloc] init]; viene chiamato anche initWithCoder? – sonoluminescence

+0

'awakeFromNib' è un posto migliore per tale inizializzazione IMO. Per rispondere alla domanda: se si crea un oggetto da un file pennino, utilizzare awakeFromNib, se si crea un oggetto nel codice, utilizzare init. – Abizern

+0

Beh, no, @sunwukong, non sto suggerendo di chiamare da solo initWithCoder. Il framework chiamerà quel metodo quando disarchiverà qualsiasi controller di vista che hai nello storyboard. Pertanto, se si desidera inizializzare un controller di visualizzazione in uno storyboard, è necessario eseguire l'override di initWithCoder: e/o awakeFromNib. –

Problemi correlati