Ce n'addChildViewController faire réellement?
Je suis juste tremper mes pieds pour la première fois dans le développement d'iOS, et l'une des premières choses que j'ai eu à faire est de mettre en œuvre un conteneur personnalisé-vue-contrôleur - appelons cela SideBarViewController
- que les swaps de plusieurs enfants de vue contrôleurs qu'il montre, presque exactement comme une norme Tab Bar Controller. (Il est à peu près un Tab Bar Controller mais avec un masquer le menu de gauche, au lieu d'une barre d'onglet.)
Selon les instructions figurant dans la documentation d'Apple, j'appelle addChildViewController
chaque fois que j'ajoute un enfant ViewController à mon conteneur. Mon code pour la permutation de l'enfant-vue-contrôleur de la SideBarViewController
ressemble à ceci:
- (void)showViewController:(UIViewController *)newViewController {
UIViewController* oldViewController = [self.childViewControllers
objectAtIndex:0];
[oldViewController removeFromParentViewController];
[oldViewController.view removeFromSuperview];
newViewController.view.frame = CGRectMake(
0, 0, self.view.frame.size.width, self.view.frame.size.height
);
[self addChildViewController: newViewController];
[self.view addSubview: newViewController.view];
}
Puis j'ai commencé à essayer de comprendre ce qu' addChildViewController
fait ici, et j'ai réalisé que je n'en ai aucune idée. En plus de coller le nouveau ViewController
dans le .childViewControllers
tableau, il ne semble pas avoir d'effet sur quoi que ce soit. Les Actions et les points de vente de l'enfant du contrôleur de vue de l'enfant contrôleur que j'ai mis sur la table de montage séquentiel fonctionnent encore très bien, même si je n'ai jamais appel addChildViewController
, et je ne peux pas imaginer ce qu'elle pourrait affecter.
En effet, si je réécrire mon code pour ne pas appeler addChildViewController
, et au lieu de le regarder comme ça...
- (void)showViewController:(UIViewController *)newViewController {
//Get the current child from a member variable of `SideBarViewController`
UIViewController* oldViewController = currentChildViewController;
[oldViewController.view removeFromSuperview];
newViewController.view.frame = CGRectMake(
0, 0, self.view.frame.size.width, self.view.frame.size.height
);
[self.view addSubview: newViewController.view];
currentChildViewController = newViewController;
}
... puis mon application fonctionne encore parfaitement, autant que je puisse dire!
La documentation d'Apple n'est pas jeter plus de lumière sur ce addChildViewController
n', ou pourquoi nous sommes censé l'appeler. L'ensemble de la mesure de la description de ce que la méthode fait ou pourquoi il doit être utilisé dans sa section dans le UIViewController
de la Classe de Référence est, à l'heure actuelle:
Ajoute le view controller comme un enfant.
...
Cette méthode est uniquement destinée à être appelée par une mise en œuvre d'un conteneur personnalisé-vue-contrôleur. Si vous passez outre cette méthode, vous devez appeler super dans votre mise en œuvre.
Il ya aussi ce point plus tôt sur la même page:
Votre conteneur view controller devez l'associer à un enfant de-vue-contrôleur avec lui-même avant d'ajouter de l'enfant en vue de la racine à la vue de la hiérarchie. Cela permet iOS correctement les événements d'itinéraire à l'enfant de voir les contrôleurs et les vues de ceux des contrôleurs de gestion. De même, après il enlève un enfant en vue de la racine à partir de son point de vue de la hiérarchie, il faut débrancher l'enfant-vue-contrôleur de lui-même. Pour faire ou briser ces associations, votre conteneur des appels de méthodes spécifiques définies par la classe de base. Ces méthodes ne sont pas destinées à être appelées par les clients de votre conteneur de classe; ils sont pour être utilisés uniquement par votre conteneur de mise en œuvre pour fournir les attendus de confinement comportement.
Ici sont les méthodes que vous pourriez avoir besoin d'appeler:
addChildViewController:
removeFromParentViewController
willMoveToParentViewController:
didMoveToParentViewController:
mais il n'offre pas la moindre idée de ce que les 'événements' ou 'prévu de confinement comportement" dont il parle sont, ou pourquoi (ou même lorsque) l'appel de ces méthodes est "essentiel".
Les exemples de conteneur personnalisé de vue des contrôleurs dans le "Conteneur Personnalisé Afficher les Contrôleurs de la" section de la documentation d'Apple de tous les appels à cette méthode, donc je suppose qu'elle sert un objectif important au-delà de sauter juste l'enfant ViewController sur un tableau, mais je ne peux pas comprendre ce que le but soit. Ce n'cette méthode de faire, et pourquoi devrais-je l'appeler?
- Apple de la WWDC 2011 les vidéos de la page a une grande session ("la mise en Œuvre de UIViewController de Confinement") sur ce sujet.
Vous devez vous connecter pour publier un commentaire.
Je me demandais à propos de cette question. J'ai regardé Session 102 de la WWDC 2011 vidéos et M.-Vue-Contrôleur, Bruce D. Nilo, a dit ceci:
Il semble donc que l'appel à
addChildViewController:
fait très peu. Les effets secondaires de l'appel sont la partie importante. Ils viennent de laparentViewController
etchildViewControllers
relations. Voici les effets secondaires que je sais:transitionFromViewController:toViewController:…
où les deux VCs besoin d'avoir le même parentnavigationController
,tabBarController
, etc propriétésJe pense qu'un exemple vaut mille mots.
Je travaillais sur une bibliothèque d'application et je voulais afficher un joli bloc-notes de la vue qui s'affiche lorsque l'utilisateur veut ajouter une note.
Après avoir essayé plusieurs solutions, j'ai fini par inventer mon propre solution personnalisée pour afficher le bloc-notes. Alors, quand je veux afficher le bloc-notes, j'ai créer une nouvelle instance de
NotepadViewController
et ajouter ses racines vue comme une sous-vue à partir de la vue principale. So far So good.Puis j'ai remarqué que le bloc-notes de l'image est partiellement caché sous le clavier en mode paysage.
J'ai donc voulu changer le bloc-notes de l'image et la déplacer vers le haut. Et pour ce faire, j'ai écrit le code approprié dans
willAnimateRotationToInterfaceOrientation:duration:
méthode, mais quand j'ai couru l'application ne s'est rien passé! Et après le débogage, j'ai remarqué qu'aucun desUIViewController
's les méthodes de la rotation est en fait appelé dansNotepadViewController
. Seules les méthodes de la vue principale du contrôleur sont appelés.Pour résoudre cela, j'ai besoin d'appeler toutes les méthodes de
NotepadViewController
manuellement lorsqu'ils sont appelés dans la vue principale du contrôleur. Ce sera bientôt rendre les choses compliquées et de créer un supplément de dépendance entre les composants sans rapport dans l'application.Qui a été dans le passé, avant que le concept de la vue enfant contrôleurs est introduit. Mais maintenant, vous avez seulement besoin de
addChildViewController
à la vue principale du contrôleur et tout ce que tout fonctionne comme prévu, sans plus de travail manuel.Edit:
Il y a deux catégories d'événements qui sont transmis à l'enfant de voir les contrôleurs:
1 - Présentation Des Méthodes:
2 - Les Méthodes De La Rotation:
Vous pouvez contrôler ce que les catégories d'événements que vous voulez être transmis automatiquement par substitution de
shouldAutomaticallyForwardRotationmethods
etshouldAutomaticallyForwardAppearancemethods
.addChildViewController
pour le contrôleur de parent.-[UIViewController addChildViewController:]
ajoute le passé en vue de contrôleur dans un tableau de viewControllers qu'un viewController (la mère) veut garder de référence de. En fait, vous devez ajouter ces viewController de vues à l'écran par vous-même en ajoutant des sous-vues d'un autre point de vue (par exemple, la parentViewController de vue). Il y a également un confort de l'objet dans Interface Builder utilise childrenViewControllers dans les Storyboards.Auparavant, pour garder des références à d'autres viewControllers dont vous avez utilisé le point de vue de l', vous avez dû conserver le manuel de référence dans @propriétés. Ayant une propriété comme
childViewControllers
et, par conséquent,parentViewController
est un moyen pratique de gérer ces interactions et de construire composé viewControllers comme le UISplitViewController que vous trouverez sur les applications iPad.En outre, childrenViewControllers également recevoir automatiquement tous les événements du système, le parent reçoit: -viewWillAppear, -viewWillDisappear, etc. Auparavant, vous devriez avoir demandé cette méthodes manuellement sur votre "childrenViewControllers".
Que c'est.
iOS "system events"
ne jette pas beaucoup de place; il ne semble pas être un terme que Apple utilise?