In WWDC 2011 Sessione 102, Apple ha introdotto View Controller di contenimento, che è la capacità di creare contenitori controller della vista su misura, analoga a UITabBarController
, UINavigationController
e simili.
Ho guardato gli esempi più volte. Ci sono una raffica di metodi associati a questo modello, ma è stato un po 'difficile capirli esattamente. Pubblicherò qui quello che penso stia succedendo e vedrò se la comunità confermerà o smentirà i miei sospetti.
Scenario 1: passaggio da nessun genitore a un nuovo controller di visualizzazione padre
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];
Le prime due righe devono comparire nell'ordine dato o possono essere invertite?
Scenario 2: passaggio da un controller di visualizzazione padre a nessun controller di visualizzazione padre
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
È anche necessario chiamare [vc didMoveToParentViewController:nil]
? Gli esempi nella Sessione 102 non hanno funzionato in questo scenario, ma non so se fosse un'omissione o meno.
Scenario 3: passaggio da un controller di visualizzazione padre a un altro
Ciò si verificherà probabilmente nel modo seguente, poiché la logica in ogni controller di visualizzazione padre verrà incapsulata.
// 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: è così che dovrebbe funzionare il contenimento del controller di visualizzazione, in generale? I meccanismi sopra indicati sono corretti?
È necessario chiamare willMoveToParentViewController
prima di chiamare addChildViewController
? Questo mi sembra l'ordine logico, ma è strettamente necessario?
È necessario chiamare didMoveToParentViewController:nil
dopo aver chiamato removeFromParentViewController
?
addChildViewController
dovrebbe essere bilanciato condidMoveToParentViewController
ewillMoveToParentViewController
dovrebbe essere bilanciato conremoveFromParentViewController
. Questo e 'esattamente quello che stavo cercando. Non sono sicuro di come mi sia perso nei documenti.