2011-12-05 25 views
103

Nella sessione 102 del WWDC 2011, Apple ha introdotto View Controller Containment, ovvero la possibilità di creare contenitori di controller di visualizzazione personalizzati, analogamente a UITabBarController, UINavigationController e simili.Come funziona View Controller Containment in iOS 5?

Ho visto gli esempi più volte. Ci sono una moltitudine di metodi associati a questo modello, ma è stato un po 'difficile individuarli esattamente. Inserirò qui ciò che penso stia succedendo e vedrò se la comunità confermerà o disconosce i miei sospetti.

Scenario 1: Il passaggio da nessun genitore a un nuovo controller di vista padre

[vc willMoveToParentViewController:self]; 
[self addChildViewController:vc]; 
[self.view addSubview:vc.view]; // or something like this. 
[vc didMoveToParentViewController:self]; 

fare le prime due righe devono accadere nell'ordine dato, o possono essere invertiti?

Scenario 2: Passare da un controller di vista genitore a nessun genitore View Controller

[vc willMoveToParentViewController:nil]; 
[vc.view removeFromSuperview]; 
[vc removeFromParentViewController]; 

E 'anche necessario chiamare [vc didMoveToParentViewController:nil]? Gli esempi nella Sessione 102 non hanno eseguito questo in questo scenario, ma non so se si è trattato di un'omissione o meno.

Scenario 3: Lo spostamento da controller di vista un genitore all'altro

Questo si verificherà probabilmente nel seguente modo, perché la logica di ogni controller vista padre sarà incapsulato.

// In the old parent 
[vc willMoveToParentViewController:nil]; 
[vc.view removeFromSuperview]; 
[vc removeFromParentViewController]; 

// In the new parent 
[vc willMoveToParentViewController:self]; 
[self addChildViewController:vc]; 
[self.view addSubview:vc.view]; 
[vc didMoveToParentViewController:self]; 

Domande

La mia domanda principale è questa: E 'questo il modo View Controller contenimento dovrebbe funzionare, in generale? I meccanismi sopra riportati sono corretti?

È necessario chiamare willMoveToParentViewController prima di chiamare addChildViewController? Questo mi sembra l'ordine logico, ma è strettamente necessario?

E 'necessario chiamare didMoveToParentViewController:nil dopo aver chiamato removeFromParentViewController?

+9

Il problema era che quando ho provato ad aggiungere il tag ios5, ho premuto per errore enter, che ha aggiunto il post anche se non avevo ancora finito di compilarlo/modificarlo. Ho provato a cancellarlo ma poi ho scoperto che potevo solo * votare * per cancellarlo. –

risposta

71

I documenti UIViewController sono abbastanza chiari su quando e quando non chiamare i metodi willMove/didMove. Controlla la documentazione di "Implementing a Container View Controller".

I documenti dicono che se non si esegue l'override di addChildViewController, non è necessario chiamare il metodo willMoveToParentViewController:. Tuttavia, è necessario chiamare il metodo didMoveToParentViewController: al termine della transizione. "Allo stesso modo, è responsabilità del controller della vista contenitore chiamare il metodoprima di chiamare il metodo removeFromParentViewController. Il metodo removeFromParentViewController chiama il metodo didMoveToParentViewController: del controller di visualizzazione figlio."

Inoltre, c'è un esempio elaborato here e codice di esempio here.

Good Luck

+15

Vedo, quindi 'addChildViewController' dovrebbe essere bilanciato con' didMoveToParentViewController' e 'willMoveToParentViewController' dovrebbe essere bilanciato con' removeFromParentViewController'. Questo e 'esattamente quello che stavo cercando. Non sono sicuro di come l'ho perso nei documenti. –

+0

Perché no? Perché non devi chiamare willMoveToParentViewController ma devi chiamare didMoveToParentViewController? –

+0

Perché è quello che dicono i documenti. Ovviamente Apple sente che non abbiamo bisogno di sapere. –

21

Questa parte non è corretto:

[vc willMoveToParentViewController:self]; 
[self addChildViewController:vc]; 
[self.view addSubview:vc.view]; // or something like this. 
[vc didMoveToParentViewController:self]; 

According to the docs:

Quando il contenitore personalizzato chiama l'addChildViewController: metodo, chiama automaticamente il willMoveToParentViewController: Metodo della vista controller da aggiungere come bambino prima di aggiungerlo.

Quindi non è necessaria la chiamata [vc willMoveToParentViewController:self]. Viene eseguito automaticamente quando si chiama [self addChildViewController:vc]. Ecco l'esempio di codice di nuovo:

[self addChildViewController:vc]; 
// [vc willMoveToParentViewController:self] called automatically 
[self.view addSubview:vc.view]; // or something like this. 
[vc didMoveToParentViewController:self]; 

For removing view controllers:

Il metodo removeFromParentViewController chiama automaticamente il didMoveToParentViewController: Metodo del controller della vista bambino dopo rimuove il bambino.

Presumibilmente questa chiamata è [oldVC didMoveToParentViewController:nil].

+0

sembra che, se fatto diversamente, anche se sembra funzionare, presentandoViewController non è impostato sul ViewController presentato. – Adrian

+0

I documenti dicono call 'didMoveToParentViewController'" ** immediatamente ** dopo aver chiamato il metodo addChildViewController: ", non specifica quando si aggiunge effettivamente la sottoview figlio. Mi chiedo se tutti hanno sbagliato. C'è un esempio in alcuni documenti Apple possiamo controllarlo? – Robert

+0

Nota: è * necessario * chiamare 'willMoveToParentViewController' prima di' addChildViewController' se l'elemento che si sta spostando è una classe personalizzata con 'addChildViewController 'sovrascritto (a meno che l'override non lo chiami internamente) – bunkerdive

Problemi correlati