Co właściwie robi addChildViewController?

Po raz pierwszy zanurzam stopy w rozwoju systemu iOS, a jedną z pierwszych rzeczy, które musiałem zrobić, jest zaimplementowanieniestandardowy kontroler widoku kontenera - Nazwijmy toSideBarViewController - zamienia to, które z kilku możliwych kontrolerów widoku dziecka, które pokazuje, prawie dokładnie jak standardKontroler paska kart. (To bardzo dużoKontroler paska kart ale z ukrytym menu bocznym zamiast paska kart.)

Zgodnie z instrukcjami w dokumentacji Apple dzwonięaddChildViewController za każdym razem, gdy dodam do mojego kontenera dziecko kontrolera ViewController. Mój kod do zamiany bieżącego kontrolera widoku dziecka jest pokazywany przezSideBarViewController wygląda tak:

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

Potem zacząłem się zastanawiać, coaddChildViewController robi tutaj i zdałem sobie sprawę, że nie mam pojęcia. Poza przyklejaniem nowegoViewController w.childViewControllers tablica, wydaje się, że nie ma na nic wpływu. Akcje i gniazda z widoku kontrolera podrzędnego do kontrolera podrzędnego, który ustawiłem w serii ujęć, nadal działają dobrze, nawet jeśli nigdy nie zadzwonięaddChildViewControlleri nie mogę sobie wyobrazić, co jeszcze mogłoby to wpłynąć.

Rzeczywiście, jeśli przepisam mój kod, żeby nie dzwonićaddChildViewControlleri zamiast tego wyglądać tak ...

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

... wtedy moja aplikacja nadal działa idealnie, o ile wiem!

Dokumentacja Apple nie rzuca światła na to, coaddChildViewController robi lub dlaczego powinniśmy to nazwać. Cały zakres odpowiedniego opisu tego, co ta metoda robi lub dlaczego powinna być użyta w jej sekcji wUIViewController Odniesienie do klasy jest obecnie:

Dodaje dany kontroler widoku jako dziecko. ... Ta metoda ma być wywoływana tylko przez implementację niestandardowego kontrolera widoku kontenera. Jeśli zastąpisz tę metodę, musisz wywołać super w swojej implementacji.

Jest też ten akapit wcześniej na tej samej stronie:

Kontroler widoku kontenera musi skojarzyć ze sobą kontroler widoku dziecka przed dodaniem widoku głównego dziecka do hierarchii widoku. Umożliwia to systemowi iOS prawidłowe kierowanie zdarzeń do kontrolerów widoku potomnego i widoków, którymi zarządzają te kontrolery. Podobnie, po usunięciu widoku głównego dziecka z hierarchii widoku powinien on odłączyć ten kontroler widoku dziecka od siebie. Aby utworzyć lub złamać te skojarzenia, Twój kontener wywołuje określone metody zdefiniowane przez klasę bazową. Metody te nie mają być wywoływane przez klientów klasy kontenera; mają być używane tylko przez implementację kontenera, aby zapewnić oczekiwane zachowanie w zakresie powstrzymywania.

Oto podstawowe metody, które możesz wywołać:

addChildViewController:
removeFromParentViewController
willMoveToParentViewController:
didMoveToParentViewController:

ale nie daje żadnej wskazówki co do tego, o jakich „zdarzeniach” lub „oczekiwanych zachowaniach ograniczających”, o których mówi, lub dlaczego (a nawet kiedy) wywoływanie tych metod jest „niezbędne”.

Przykłady niestandardowych kontrolerów widoku kontenerów w sekcji „Kontrolery widoku niestandardowego kontenera” dokumentacji Apple nazywają tę metodę, więc zakładam, że służy ona pewnemu ważnemu celowi, poza zwykłym wyskakiwaniem podrzędnego kontrolera ViewController na tablicę, ale nie mogę tego zrobić. co to za cel. Co robi ta metoda i dlaczego powinienem to nazwać?

questionAnswers(3)

yourAnswerToTheQuestion