107 votes

Comment fonctionne View Controller Containment dans iOS 5?

Dans la WWDC 2011 Session 102, Apple a introduit la-Vue-Contrôleur de Confinement, qui est la capacité à créer un affichage personnalisé contrôleur de conteneurs, analogue à UITabBarController, UINavigationController, et la comme.

J'ai regardé les exemples plusieurs fois. Il y a une foule de méthodes associées à ce modèle, mais il était un peu dur à comprendre exactement. Je vais les poster ici, je pense que ce qui se passe et voir si la communauté ne permet de confirmer ou disconfirm mes soupçons.

Scénario 1: le passage de la pas de parent à parent-vue-contrôleur

[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];

Faire les deux premières lignes ont à se produire dans l'ordre donné, ou peut-il être inversé?

Scénario 2: Déplacement d'un parent-vue-contrôleur à aucun parent-vue-contrôleur

[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];

Il est également nécessaire de faire appel [vc didMoveToParentViewController:nil]? Les exemples de la Session 102 ne l'a pas fait dans ce scénario, mais je ne sais pas si c'était une omission ou pas.

Scénario 3: le passage de l'un des parents-vue-contrôleur à l'autre

Ceci risque de se produire de la manière suivante, parce que la logique de chaque parent-vue-contrôleur sera encapsulé.

// In the old parent
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];

// In the new parent
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view];
[vc didMoveToParentViewController:self];

Questions

Ma principale question est celle-ci: Est-ce de cette manière-vue-contrôleur de confinement doit travailler, en général? Sont la mécanique donnée ci-dessus est correcte?

Est-il nécessaire de convoquer willMoveToParentViewController avant d'appeler addChildViewController? Cela semble logique pour moi, mais est-il absolument nécessaire?

Est-il nécessaire de convoquer didMoveToParentViewController:nil après l'appel de removeFromParentViewController?

73voto

timthetoolman Points 3753

Le UIViewController docs sont assez clairs sur quand et quand ne pas appeler willMove/didMove méthodes. Découvrez la "mise en Œuvre d'un Conteneur View Controller" de la documentation.

Les docs dire, que si vous ne pas écraser addChildViewController, vous n'avez pas à appeler willMoveToParentViewController: méthode. Cependant, vous ne devez appeler l' didMoveToParentViewController: méthode après l'achèvement de la transition. "De même, il est de la responsabilité du conteneur view controller pour appeler l' willMoveToParentViewController: méthode avant d'appeler l' removeFromParentViewController méthode. L' removeFromParentViewController des appels à la méthode de l' didMoveToParentViewController: méthode de l'enfant-vue-contrôleur."

Aussi, il y a par exemple travaillé ici et un exemple de code ici.

Bonne Chance

22voto

nevan king Points 46410

Cette partie n'est pas correct:

[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];

Selon les docs:

Lors de votre conteneur personnalisé appelle la addChildViewController: la méthode, il appelle automatiquement le willMoveToParentViewController: méthode de la vue-contrôleur d'ajouter, comme un enfant avant de l'ajouter.

Si vous n'avez pas besoin de l' [vc willMoveToParentViewController:self] appel. C'est fait automatiquement lorsque vous appelez [self addChildViewController:vc]. Voici l'exemple de code à nouveau:

[self addChildViewController:vc];
// [vc willMoveToParentViewController:self] called automatically
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];

Pour la suppression des contrôleurs de vue:

Le removeFromParentViewController méthode appelle automatiquement le didMoveToParentViewController: méthode de l'enfant-vue-contrôleur après il enlève l'enfant.

Sans doute cet appel est - [oldVC didMoveToParentViewController:nil].

[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
// [vc didMoveToParentViewController:nil] called automatically

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