Sto solo tuffando i miei piedi per la prima volta nello sviluppo di iOS, e una delle prime cose che ho dovuto fare è implementare un custom container view controller - chiamiamolo SideBarViewController
- che scambia quale di diversi possibili controller di vista figlio esso mostra, quasi esattamente come uno standard Controller Barra di Tab. (E 'praticamente un Tab Bar controller ma con un menu laterale hideable invece di una barra delle schede.)Cosa fa effettivamente addChildViewController?
secondo le istruzioni riportate nella documentazione di Apple, che io chiamo addChildViewController
ogni volta aggiungo un bambino ViewController al mio contenitore. Il mio codice per scambiare il controller della vista bambino corrente che viene mostrato dal SideBarViewController
assomiglia a questo:
- (void)showViewController:(UIViewController *)newViewController {
UIViewController* oldViewController = [self.childViewControllers
objectAtIndex:0];
[oldViewController removeFromParentViewController];
[oldViewController.view removeFromSuperview];
newViewController.view.frame = CGRectMake(
0, 0, self.view.frame.size.width, self.view.frame.size.height
);
[self addChildViewController: newViewController];
[self.view addSubview: newViewController.view];
}
Poi ho iniziato cercando di capire che cosa addChildViewController
fa qui, e mi sono reso conto che non ho idea. Oltre ad attaccare il nuovo nell'array .childViewControllers
, sembra che non abbia alcun effetto su nulla. Le azioni e le uscite dalla vista del controller figlio al controller figlio che ho impostato sullo storyboard funzionano ancora bene anche se non chiamo mai addChildViewController
e non riesco a immaginare cos'altro potrebbe influenzare.
In effetti, se riscrivo il mio codice di non chiamare addChildViewController
, e invece simile a questa ...
- (void)showViewController:(UIViewController *)newViewController {
// Get the current child from a member variable of `SideBarViewController`
UIViewController* oldViewController = currentChildViewController;
[oldViewController.view removeFromSuperview];
newViewController.view.frame = CGRectMake(
0, 0, self.view.frame.size.width, self.view.frame.size.height
);
[self.view addSubview: newViewController.view];
currentChildViewController = newViewController;
}
... poi la mia applicazione funziona ancora perfettamente, per quanto posso dire!
La documentazione Apple non fa molta luce su cosa fa addChildViewController
o sul motivo per cui dovremmo chiamarlo. L'intera estensione della relativa descrizione di ciò che il metodo fa o perché dovrebbe essere utilizzato nella sua sezione nella UIViewController
Class Reference è, allo stato attuale:
aggiunge la controller di vista come un bambino. ... Questo metodo deve essere chiamato solo da un'implementazione di un controller di visualizzazione contenitore personalizzato. Se si sostituisce questo metodo, è necessario chiamare super nella propria implementazione.
C'è anche questo paragrafo in precedenza sulla stessa pagina:
Il controller vista contenitore deve associare un controller di vista del bambino con se stessa prima di aggiungere vista radice del bambino alla gerarchia della vista. Ciò consente a iOS di indirizzare correttamente gli eventi ai controller di visualizzazione figlio e alle visualizzazioni gestite dai controller. Allo stesso modo, dopo aver rimosso la vista radice di un figlio dalla sua gerarchia di visualizzazione, dovrebbe disconnettere il controller di visualizzazione figlio da se stesso. Per creare o distruggere queste associazioni, il tuo contenitore chiama metodi specifici definiti dalla classe base. Questi metodi non sono destinati a essere chiamati dai client della classe del contenitore; devono essere utilizzati solo dall'implementazione del contenitore per fornire il comportamento previsto di contenimento.
Questi sono i metodi essenziali si potrebbe aver bisogno di chiamare:
addChildViewController:
removeFromParentViewController
willMoveToParentViewController:
didMoveToParentViewController:
ma non offre alcun indizio su ciò che il "eventi" o "comportamento atteso di contenimento" di cui parla o perché (o anche quando) chiamare questi metodi è "essenziale".
Gli esempi di controller di visualizzazione contenitore personalizzati nella sezione "Controller di visualizzazione contenitori personalizzati" della documentazione di Apple chiamano tutti questo metodo, quindi presumo che serva a uno scopo importante oltre a far scattare il ViewController secondario su un array, ma io non riesco a capire quale sia lo scopo. Che cosa fa questo metodo e perché dovrei chiamarlo?
di Apple [** 2011 ** WWDC] (https://developer.apple.com/videos/wwdc/2011/) la pagina dei video ha una sessione _great_ ("Implementazione del contenimento di UIViewController") su questo argomento. – Alladinian