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.
InformationsquelleAutor Mark Amery | 2013-06-19