web-dev-qa-db-fra.com

Quand utiliser addChildViewController vs pushViewController

Je viens de regarder une présentation 2011 WWDC sur "Implémentation du confinement UIViewController" ( voici un lien vers la vidéo )

Ils ont mentionné ces deux façons d'ajouter des viewControllers à l'écran, et j'apprécierais quelques précisions sur les meilleures pratiques ...

addChildViewController/removeFromParentViewController
utilisé avec un @property (nonatomique, en lecture seule) NSArray * childViewControllers et [self transitionFromViewController:currentView toViewController:nextView duration: options: animations: completion:];

pushViewController: animated:/popViewControllerAnimated
ils ont très rapidement survolé ceci dans la présentation

Dans mes applications, j'utilise tous les ViewControllers personnalisés, et jusqu'à aujourd'hui, je les ai toujours gérés avec:

[nextController performSelector:@selector(setDelegate:) withObject:self];
[currentPageController.view removeFromSuperview];
[self.view addSubview:nextController.view];

Mais je comprends maintenant que c'est une mauvaise pratique, et je me demande quelle est la bonne façon d'utiliser "addChildViewController" et quelle est la bonne façon d'utiliser "pushViewController"?

J'apprécie vraiment vos réflexions à ce sujet!

34
RanLearns

Oui, pushViewController: est destiné aux contrôleurs de navigation qui gèrent une pile de contrôleurs de vue. addChildViewController: d'autre part fait partie d'une fonctionnalité iOS 5 appelée "confinement du contrôleur de vue".

L'idée de base derrière cela est que vous pouvez intégrer vos contrôleurs de vue dans d'autres contrôleurs de vue (par exemple lorsque vous portez une application iPhone sur l'iPad) et ainsi faire facilement votre propre mise en œuvre de choses comme les contrôleurs de navigation, les contrôleurs de vue fractionnée, etc.

Un problème avec une implémentation comme celle que vous montrez est que vous ne gérez que les vues. Les événements de contrôleur de vue tels que les changements d'orientation ne seront pas transmis correctement dans la hiérarchie. Le confinement du contrôleur de vue tente de garantir que tous les contrôleurs de vue contenus recevront également les messages appropriés.

En examinant votre implémentation, vous devez également réfléchir à ce que vous voulez vraiment réaliser par cela. Un contrôleur de navigation peut être la bonne chose ou vous pouvez même afficher le prochain contrôleur de manière modale (voir https://developer.Apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/PresentingaViewController.html ) Un bonus lorsque vous utilisez ces méthodes (par exemple, les contrôleurs de navigation et les vues modales), c'est que l'utilisateur est déjà familier avec ces techniques de navigation.

Dans tous les cas https://developer.Apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ est une bonne lecture sur la façon de faire la transition entre les contrôleurs de vue.

Lorsque vous utilisez le confinement du contrôleur de vue, vous devez essentiellement ajouter la vue à la vue contenant comme d'habitude (cela doit être fait même si le contrôleur est ajouté). Ensuite, vous utilisez addChildViewController: pour ajouter le contrôleur de vue enfant à celui qui l'entoure. Vous devez également informer le contrôleur enfant par didMoveToParentViewController: qu'il a été placé dans un autre contrôleur. Vous pouvez aussi utiliser transitionFromViewController:toViewController: pour échanger un contrôleur de vue contre un autre, en donnant éventuellement une animation.

73