web-dev-qa-db-fra.com

Dois-je appeler addSubview après avoir appelé addChildViewController?

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?

58
Ricardo

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 ).

42
macserv

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:

IViewController + Container

- (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];

}

Ressource officielle sur developer.Apple.com

84
Peter Lapisu

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.

3
user3099609

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.

0
Avinash B