Was macht eigentlich addChildViewController?

Ich tauche gerade zum ersten Mal in die iOS-Entwicklung ein und eines der ersten Dinge, die ich tun musste, ist das Implementieren einesBenutzerdefinierter Container View Controller - Lass es uns nennenSideBarViewController - Damit wird fast genau wie bei einem Standard ausgetauscht, welche der verschiedenen möglichen untergeordneten Ansichtssteuerungen angezeigt werdenRegisterleisten-Controller. (Es ist so ziemlich einRegisterleisten-Controller aber mit einem versteckbaren Seitenmenü anstelle einer Tab-Leiste.)

Gemäß den Anweisungen in der Apple-Dokumentation rufe ich anaddChildViewController wenn ich meinem Container einen untergeordneten ViewController hinzufüge. Mein Code zum Auswechseln des aktuellen untergeordneten Ansichtscontrollers wird von der angezeigtSideBarViewController sieht aus wie das:

- (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];
}

Dann fing ich an herauszufinden, was genauaddChildViewController tut hier, und ich erkannte, dass ich keine Ahnung habe. Neben dem neuen klebenViewController in dem.childViewControllers Array, scheint es keine Auswirkungen auf irgendetwas zu haben. Aktionen und Ausgänge aus der Sicht des untergeordneten Controllers zum untergeordneten Controller, die ich im Storyboard festgelegt habe, funktionieren immer noch einwandfrei, auch wenn ich nie anrufeaddChildViewController, und ich kann mir nicht vorstellen, was es sonst noch beeinflussen könnte.

In der Tat, wenn ich meinen Code umschreibe, um nicht anzurufenaddChildViewControllerund stattdessen so aussehen ...

- (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;
}

... dann funktioniert meine App nach wie vor einwandfrei, soweit ich das beurteilen kann!

Die Apple-Dokumentation gibt nicht viel Aufschluss darüber, was passiertaddChildViewController oder warum wir es nennen sollen. Der gesamte Umfang der relevanten Beschreibung, was die Methode tut oder warum sie angewendet werden sollte, in ihrem Abschnitt in derUIViewController Klassenreferenz ist derzeit:

Fügt den angegebenen Ansichtscontroller als untergeordnetes Element hinzu. ... Diese Methode soll nur von einer Implementierung eines benutzerdefinierten Container-View-Controllers aufgerufen werden. Wenn Sie diese Methode überschreiben, müssen Sie in Ihrer Implementierung super aufrufen.

Es gibt auch diesen Absatz weiter oben auf derselben Seite:

Ihr Container View Controller muss einen untergeordneten View Controller mit sich selbst verknüpfen, bevor Sie die Stammansicht des Kindes zur Ansichtshierarchie hinzufügen. Auf diese Weise kann iOS Ereignisse ordnungsgemäß an untergeordnete Ansichtscontroller und die von diesen Controllern verwalteten Ansichten weiterleiten. Nachdem die Stammansicht eines Kindes aus der Ansichtshierarchie entfernt wurde, sollte der betreffende untergeordnete Ansichtscontroller ebenfalls von sich selbst getrennt werden. Um diese Assoziationen herzustellen oder zu unterbrechen, ruft Ihr Container bestimmte Methoden auf, die von der Basisklasse definiert werden. Diese Methoden sollen nicht von Clients Ihrer Containerklasse aufgerufen werden. Sie dürfen nur von der Implementierung Ihres Containers verwendet werden, um das erwartete Containment-Verhalten zu erzielen.

Hier sind die wesentlichen Methoden, die Sie möglicherweise aufrufen müssen:

addChildViewController:
removeFromParentViewController
willMoveToParentViewController:
didMoveToParentViewController:

Es gibt jedoch keinen Hinweis darauf, um welche „Ereignisse“ oder welches „erwartete Einschlussverhalten“ es sich handelt oder warum (oder sogar wann) der Aufruf dieser Methoden „wesentlich“ ist.

Die Beispiele für benutzerdefinierte Container-Ansichts-Controller im Abschnitt "Benutzerdefinierte Container-Ansichts-Controller" der Apple-Dokumentation bezeichnen alle diese Methode. Ich gehe daher davon aus, dass sie einen wichtigen Zweck erfüllt, der nicht nur darin besteht, den untergeordneten ViewController auf einem Array abzulegen, aber ich kann es nicht herausfinden herauszufinden, was dieser Zweck ist. Was macht diese Methode und warum soll ich sie aufrufen?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage