J'essaie de créer un contrôleur de vue de conteneur à l'aide de iOS5
et de nouvelles méthodes comme addChildViewController
.
Dois-je appeler addSubview
après avoir appelé addChildViewController
?
Dois-je appeler removeFromSuperview
avant d'appeler removeChildViewController
?
Je ne vois rien à ce sujet dans Apple docs. Que pensez-vous?
Réponse courte: "Oui, et oui." La hiérarchie de vue et la hiérarchie de contrôleur de vue sont toujours indépendantes. L'API de confinement permet simplement aux vues des autres contrôleurs de se présenter dans la vue d'un contrôleur parent de manière claire et cohérente.
Vous pouvez en trouver un peu dans les documents d'Apple ici ... ceci est un passage pertinent de la section "Container View Controllers Arrange Content of Other View Controllers":
Un conteneur gère une hiérarchie de vues comme le font les autres contrôleurs de vues. Un conteneur peut également ajouter les vues de n'importe lequel de ses enfants dans sa hiérarchie de vues. Le conteneur décide quand une telle vue est ajoutée et comment elle doit être dimensionnée pour s'adapter à la hiérarchie des vues du conteneur, mais sinon le contrôleur de vue enfant reste responsable de la vue et de ses sous-vues.
Si vous y avez accès, je vous recommande fortement de consulter la vidéo WWDC 2011 intitulée "Implémentation du confinement UIViewController" ( téléchargez-la depuis Apple Developer Video Archive ).
1) Dois-je appeler addSubview après avoir appelé addChildViewController?
Oui
2) Dois-je appeler removeFromSuperview avant d'appeler removeChildViewController?
Pas assez
Vous devez appeler removeFromParentViewController:
au lieu de removeChildViewController:
Vous devez également appeler willMoveToParentViewController:
Pour ajouter/supprimer, vous pouvez vous référer à cette grande catégorie:
- (void)containerAddChildViewController:(UIViewController *)childViewController {
[self addChildViewController:childViewController];
[self.view addSubview:childViewController.view];
[childViewController didMoveToParentViewController:self];
}
- (void)containerRemoveChildViewController:(UIViewController *)childViewController {
[childViewController willMoveToParentViewController:nil];
[childViewController.view removeFromSuperview];
[childViewController removeFromParentViewController];
}
Ajout à la réponse de Peter: une des raisons pour lesquelles j'ai appelé addChildViewController
avant addSubview
était que lorsque addSubview
est appelé, le viewDidLoad
de l'enfant est appelé, et dans certains cas, vous souhaiterez que la hiérarchie parent-enfant soit correctement configurée à ce stade. Si cela n'est pas fait, pendant child le viewDidLoad, la propriété parentViewController sera nulle.
Ce qui suit est un exemple fourni par la documentation Apple.
- (void) displayContentController: (UIViewController*) content {
[self addChildViewController:content];
content.view.frame = [self frameForContentController];
[self.view addSubview:self.currentClientView];
[content didMoveToParentViewController:self];
}
Vous pouvez également parcourir l'explication détaillée donnée ici - https://developer.Apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html
Cela vous donnera une idée des relations entre les contrôleurs de vue enfant et parent et comment travailler avec eux.