Je me lance pour la première fois dans le développement iOS, et l'une des premières choses que j'ai dû faire est d'implémenter une fonction contrôleur de vue de conteneur personnalisé - appelons-le SideBarViewController
- qui change le contrôleur de vue enfant qu'il affiche, parmi plusieurs possibles, presque exactement comme un contrôleur de vue enfant standard. Contrôleur de la barre d'onglets . (C'est à peu près un Contrôleur de la barre d'onglets mais avec un menu latéral masquable au lieu d'une barre d'onglets).
Conformément aux instructions de la documentation d'Apple, j'appelle addChildViewController
chaque fois que j'ajoute un ViewController enfant à mon conteneur. Mon code pour remplacer le contrôleur de vue enfant actuel affiché par la balise SideBarViewController
ressemble à ça :
- (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];
}
Puis j'ai commencé à essayer de comprendre ce que addChildViewController
fait ici, et je me suis rendu compte que je n'en ai aucune idée. En plus de coller le nouveau ViewController
dans le .childViewControllers
le tableau, il semble n'avoir aucun effet sur quoi que ce soit. Les actions et les sorties de la vue du contrôleur enfant vers le contrôleur enfant que j'ai définies dans le storyboard fonctionnent toujours très bien, même si je n'appelle jamais addChildViewController
et je ne peux pas imaginer ce que ça pourrait affecter d'autre.
En effet, si je réécris mon code pour ne pas appeler addChildViewController
et ressemblent plutôt à ceci...
- (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;
}
... alors mon application fonctionne toujours parfaitement, pour autant que je puisse dire !
La documentation d'Apple n'apporte pas beaucoup d'éclaircissements sur ce qu'il faut faire. addChildViewController
fait, ou pourquoi nous sommes supposés l'appeler. Toute l'étendue de la description pertinente de ce que fait la méthode ou de la raison pour laquelle on doit l'utiliser dans sa section dans les UIViewController
Référence de la classe est, à l'heure actuelle :
Ajoute le contrôleur de vue donné comme enfant. ... Cette méthode est uniquement destinée à être appelée par une implémentation d'un contrôleur de vue de conteneur personnalisé. Si vous surchargez cette méthode, vous devez appeler super dans votre implémentation.
Il y a aussi ce paragraphe plus tôt sur la même page :
Votre contrôleur de vue de conteneur doit associer un contrôleur de vue enfant à lui-même avant d'ajouter la vue racine de l'enfant à la hiérarchie des vues. Cela permet à iOS d'acheminer correctement les événements vers les contrôleurs de vue enfant et les vues que ces contrôleurs gèrent. De même, après avoir supprimé la vue racine d'un enfant de sa hiérarchie de vues, il doit déconnecter ce contrôleur de vue enfant de lui-même. Pour établir ou rompre ces associations, votre conteneur appelle des méthodes spécifiques définies par la classe de base. Ces méthodes ne sont pas destinées à être appelées par les clients de votre classe de conteneur ; elles doivent être utilisées uniquement par l'implémentation de votre conteneur pour fournir le comportement de confinement attendu.
Voici les méthodes essentielles que vous pourriez avoir besoin d'appeler :
addChildViewController :
removeFromParentViewController
willMoveToParentViewController :
didMoveToParentViewController :
mais il n'offre aucun indice sur ce que sont les "événements" ou le "comportement de confinement attendu" dont il parle, ni pourquoi (ou même quand) l'appel de ces méthodes est "essentiel".
Les exemples de contrôleurs de vue de conteneur personnalisés dans la section "Custom Container View Controllers" de la documentation Apple font tous appel à cette méthode. Je suppose donc qu'elle a un rôle important à jouer, au-delà du simple fait de placer le ViewController enfant dans un tableau, mais je n'arrive pas à savoir quel est ce rôle. Que fait cette méthode, et pourquoi devrais-je l'appeler ?
3 votes
Apple WWDC 2011 La page des vidéos a une grand ("Implementing UIViewController Containment") sur ce sujet.