Dans la WWDC 2011 Session 102, Apple a introduit View Controller confinement, qui est la capacité de créer des conteneurs de contrôleur d'affichage personnalisé, analogue à UITabBarController
, UINavigationController
et autres.
J'ai regardé les exemples plusieurs fois. Il existe une multitude de méthodes associées à ce modèle, mais il était un peu difficile de les comprendre exactement. Je vais poster ici ce que je pense qui se passe et voir si la communauté va confirmer ou infirmer mes soupçons.
Scénario 1: passer de l'absence de parent à un nouveau contrôleur de vue parent
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];
Les deux premières lignes doivent-elles apparaître dans l'ordre indiqué ou peuvent-elles être inversées?
Scénario 2: passer d'un contrôleur de vue parent à aucun contrôleur de vue parent
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
Est-il également nécessaire d'appeler [vc didMoveToParentViewController:nil]
? Les exemples de la session 102 n'ont pas fait cela dans ce scénario, mais je ne sais pas si c'était une omission ou non.
Scénario 3: passage d'un contrôleur de vue parent à un autre
Cela se produira probablement de la manière suivante, car la logique de chaque contrôleur de vue parent sera encapsulée.
// 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];
Des questions
Ma question principale est la suivante: est-ce ainsi que le confinement du contrôleur de vue devrait fonctionner, en général? Les mécanismes donnés ci-dessus sont-ils corrects?
Est-il nécessaire d'appeler willMoveToParentViewController
avant d'appeler addChildViewController
? Cela me semble être l'ordre logique, mais est-ce strictement nécessaire?
Est-il nécessaire d'appeler didMoveToParentViewController:nil
après avoir appelé removeFromParentViewController
?
addChildViewController
devrait être équilibré avecdidMoveToParentViewController
etwillMoveToParentViewController
devrait être équilibré avecremoveFromParentViewController
. Ceci est exactement ce que je cherchais. Je ne sais pas comment je l'ai manqué dans la documentation.