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
?
la source
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.Cette partie n'est pas correcte:
Selon la documentation:
Vous n'avez donc pas besoin de l'
[vc willMoveToParentViewController:self]
appel. Cela se fait automatiquement lorsque vous appelez[self addChildViewController:vc]
. Voici à nouveau l'exemple de code:Pour supprimer des contrôleurs de vue:
Vraisemblablement, cet appel est
[oldVC didMoveToParentViewController:nil]
.la source
didMoveToParentViewController
" immédiatement après avoir appelé la méthode addChildViewController:", cela ne spécifie pas quand vous ajoutez réellement la sous-vue enfant. Je me demande si tout le monde s'est trompé. Y a-t-il un exemple dans certains documents Apple sur lesquels nous pouvons vérifier cela?willMoveToParentViewController
avantaddChildViewController
si l'élément que vous déplacez est une classe personnalisée avec surchargéeaddChildViewController
(sauf si votre override appelle en interne)