Sto solo immergendo i miei piedi per la prima volta nello sviluppo iOS e una delle prime cose che ho dovuto fare è stata implementare un controller di visualizzazione del contenitore personalizzato - chiamiamolo SideBarViewController
- che sostituisce quale dei diversi possibili controller di visualizzazione figlio è mostra, quasi esattamente come un controller Tab Bar standard . (È praticamente un controller della barra delle schede, ma con un menu laterale nascosta invece di una barra delle schede.)
Secondo le istruzioni nella documentazione Apple, chiamo addChildViewController
ogni volta che aggiungo un ViewController figlio al mio contenitore. Il mio codice per lo scambio del controller di visualizzazione figlio corrente mostrato SideBarViewController
dall'aspetto simile 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 a cercare di capire cosa addChildViewController
fa qui, e mi sono reso conto che non ne avevo idea. Oltre attaccare il nuovo ViewController
nella .childViewControllers
matrice, sembra non avere alcun effetto su nulla. Le azioni e gli sbocchi dal punto di 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 per non chiamare addChildViewController
, e invece assomiglio a questo ...
- (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;
}
... allora la mia app funziona ancora perfettamente, per quanto ne so!
La documentazione di Apple non fa molta luce su cosa addChildViewController
fa o perché dovremmo chiamarlo. L'intera portata della descrizione pertinente di ciò che fa il metodo o del motivo per cui dovrebbe essere utilizzato nella sua sezione nel UIViewController
riferimento della classe è, al momento:
Aggiunge il controller di visualizzazione specificato come bambino. ... Questo metodo deve essere chiamato solo da un'implementazione di un controller di visualizzazione del contenitore personalizzato. Se sostituisci questo metodo, devi chiamare super nella tua implementazione.
C'è anche questo paragrafo prima nella stessa pagina:
Il controller della vista del contenitore deve associare un controller della vista figlio a se stesso prima di aggiungere la vista radice del figlio alla gerarchia della vista. Ciò consente a iOS di instradare correttamente gli eventi ai controller di visualizzazione figlio e alle visualizzazioni gestite da tali controller. Allo stesso modo, dopo aver rimosso la vista radice di un bambino dalla sua gerarchia di viste, dovrebbe disconnettere quel controller della vista figlio da se stesso. Per creare o interrompere queste associazioni, il contenitore chiama metodi specifici definiti dalla classe base. Questi metodi non sono destinati a essere chiamati dai client della classe contenitore; devono essere utilizzati solo dall'implementazione del contenitore per fornire il comportamento di contenimento previsto.
Ecco i metodi essenziali che potresti dover chiamare:
addChildViewController:
removeFromParentViewController
willMoveToParentViewController:
didMoveToParentViewController:
ma non offre alcun indizio su cosa siano gli "eventi" o il "comportamento di contenimento previsto" di cui si parla, o perché (o anche quando) chiamare questi metodi sia "essenziale".
Gli esempi di controller di visualizzazione del contenitore personalizzati nella sezione "Controller di visualizzazione del contenitore personalizzati" della documentazione Apple chiamano tutti questo metodo, quindi presumo che serva a uno scopo importante oltre al semplice inserimento del ViewController figlio su un array, ma non riesco a capire scoprire qual è lo scopo. Cosa fa questo metodo e perché dovrei chiamarlo?