Po raz pierwszy zanurzam się w rozwoju iOS i jedną z pierwszych rzeczy, które musiałem zrobić, jest implementacja custom container view controller - pozwala to nazwać je SideBarViewController
- która zamienia który z kilku możliwych kontrolerów widoku podrzędnego to pokazuje, prawie dokładnie tak, jak standardowy kontroler paska zakładek . (Jest to dość dużo Tab Bar Controller ale z hideable bocznym menu zamiast paska kart.)Co właściwie robi addChildViewController?
zgodnie z instrukcjami zawartymi w dokumentacji firmy Apple, wzywam addChildViewController
gdy dodam dziecko ViewController do mojego pojemnika. Mój kod wymieniając bieżący kontroler widoku dziecko wykazanie przez SideBarViewController
wygląda następująco:
- (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 próbuje dowiedzieć się, co robi tutaj addChildViewController
, i zdałem sobie sprawę, że nie mam pojęcia. Poza przyklejeniem nowego ViewController
w tablicy .childViewControllers
, wydaje się, że nie ma żadnego wpływu na nic. Akcje i punkty sprzedaży z widoku kontrolera dziecięcego do kontrolera podrzędnego, który ustawiłem w scenorysie, nadal działają dobrze, nawet jeśli nigdy nie zadzwonię pod numer addChildViewController
i nie wyobrażam sobie, na co jeszcze mógłby on wpłynąć.
Rzeczywiście, gdybym przepisać mój kod, aby nie wywołać addChildViewController
i zamiast 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;
}
... to moja aplikacja nadal działa idealnie, więc ile mogę powiedzieć!
Dokumentacja Apple nie rzuca dużo światła na to, co robi addChildViewController
lub dlaczego powinniśmy to nazwać. Cały zakres odpowiednim opisem tego, co robi i dlaczego metoda powinna być stosowana w swojej sekcji w UIViewController
Class Reference jest w chwili obecnej:
dodaje podany kontrolera widoku za dziecko. ... Ta metoda jest przeznaczona tylko do wywołania przez implementację niestandardowego kontrolera widoku kontenera. Jeśli zastąpisz tę metodę, musisz wywołać super w swojej implementacji.
Istnieje również ten akapit wcześniej na tej samej stronie:
Kontener widok kontroler musi kojarzyć kontroler widoku dziecko ze sobą przed dodaniem widoku głównego dziecka do hierarchii widoku. Dzięki temu system iOS może prawidłowo kierować zdarzenia do kontrolerów podrzędnych i widoki, którymi zarządzają te kontrolery. Podobnie, po usunięciu widoku głównego dziecka z jego hierarchii widoku, powinien on odłączyć ten kontroler widoku podrzędnego od siebie. Aby je utworzyć lub je zerwać, kontener wywołuje określone metody zdefiniowane przez klasę podstawową. Te metody nie są przeznaczone do wywoływania przez klientów Twojej klasy kontenera; mają być używane tylko przez implementację kontenera w celu zapewnienia oczekiwanego zachowania ograniczającego.
Oto zasadnicze metody może trzeba zadzwonić:
addChildViewController:
removeFromParentViewController
willMoveToParentViewController:
didMoveToParentViewController:
ale nie oferuje żadnej wskazówki co do tego, co "zdarzenia" lub "oczekiwane działanie ograniczające rozprzestrzenianie", o których mówi, lub dlaczego (lub nawet kiedy) wywoływanie tych metod jest "niezbędne".
Przykłady niestandardowych kontrolerów widoku kontenerów w sekcji "Niestandardowe kontrolery kontenera" w dokumentacji Apple nazywają tę metodę, więc zakładam, że spełnia ona pewne ważne zadanie poza poprzesłaniem dziecka ViewController na tablicę, ale ja nie rozumiem, jaki jest ten cel. Co robi ta metoda i dlaczego powinienem ją nazwać?
Apple [** 2011 ** WWDC] (https://developer.apple.com/videos/wwdc/2011/) strona z filmami ma sesję _great_ ("Implementowanie zabezpieczenia UIViewController") na ten temat. – Alladinian