58 votes

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

J'essaie de créer un contrôleur de vue de conteneur en utilisant 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 la documentation d'Apple. Qu'en pensez-vous ?

84voto

Peter Lapisu Points 3274

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

Oui

2) Dois-je appeler removeFromSuperview avant d'appeler removeChildViewController ?

Pas tout à fait.

Vous devez appeler removeFromParentViewController: au lieu de removeChildViewController: Vous devriez également appeler willMoveToParentViewController:

Pour ajouter / supprimer, vous pouvez vous référer à cette grande catégorie :

UIViewController + Conteneur

- (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 le site developer.apple.com

1 votes

Très utile cette catégorie. Merci beaucoup.

0 votes

Exactement ce que je cherchais ! Merci à Peter

1 votes

@Peter-Lapisu, pourquoi n'appelez vous pas [childViewController willMoveToParentViewController:self] dans la méthode containerAddChildViewContoller ?

43voto

macserv Points 1459

Réponse courte : "Oui, et oui." La hiérarchie des vues et la vue contrôleur La hiérarchie est toujours indépendante. L'API de confinement permet simplement aux vues d'autres contrôleurs de se présenter dans la vue d'un contrôleur parent d'une manière propre et cohérente.

Vous pouvez en trouver un peu dans Les documents d'Apple ici ... il s'agit d'un passage pertinent de la section "Les contrôleurs de vue de conteneur organisent le contenu d'autres contrôleurs de vue" :

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 du moment où une telle vue est ajoutée et de la manière dont elle doit être dimensionnée pour s'adapter à la hiérarchie des vues du conteneur, mais sinon, le contrôleur de vues enfant reste responsable de la vue et de ses sous-vues.

Si vous y avez accès, je vous recommande vivement de regarder la vidéo de la WWDC 2011 intitulée "Implementing UIViewController Containment" ( Téléchargez-le sur Apple Developer Video Archive ).

1 votes

Merci beaucoup. Si je détruis le conteneur, dois-je également appeler removeViewFromSuperview ? Ou même removeChildViewController ?

0 votes

Votre citation de la doc d'Apple ne peut être trouvée que sur archive.org. Vous pouvez la remplacer par une citation plus récente de 1 , 2 o 3 .

3voto

user3099609 Points 401

Ajoutant à la réponse de Peter : une raison que j'ai trouvée pour appeler addChildViewController avant addSubview était que lorsque addSubview est appelé, alors le viewDidLoad de l'enfant est appelé, et dans certains cas, vous voudrez que la hiérarchie parent-enfant soit correctement établie à ce moment-là. Si cela n'est pas fait, pendant le viewDidLoad de l'enfant, la propriété parentViewController sera nulle.

0voto

Avinash B Points 1007

L'exemple ci-dessous est fourni par la documentation d'Apple.

- (void) displayContentController: (UIViewController*) content {
   [self addChildViewController:content];
   content.view.frame = [self frameForContentController];
   [self.view addSubview:self.currentClientView];
   [content didMoveToParentViewController:self];
}

Vous pouvez également consulter 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 de la façon de travailler avec eux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X