W WWDC 2011 Session 102, Apple wprowadził View Controller obudowy, która jest zdolność do tworzenia niestandardowego widoku pojemników kontrolera, analogicznie do UITabBarController, UINavigationControlleri tym podobne.
Kilka razy oglądałem przykłady. Istnieje wiele metod związanych z tym wzorcem, ale trochę trudno było je dokładnie rozgryźć. Zamierzam opublikować tutaj, co myślę, że się dzieje i zobaczę, czy społeczność potwierdzi lub zaprze moje podejrzenia.
Scenariusz 1: przejście od braku nadrzędnego do nowego nadrzędnego kontrolera widoku
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];
Czy pierwsze dwie linie muszą występować w podanej kolejności, czy można je odwrócić?
Scenariusz 2: przejście z nadrzędnego kontrolera widoku na brak nadrzędnego kontrolera widoku
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
Czy trzeba też dzwonić [vc didMoveToParentViewController:nil]? Przykłady z sesji 102 nie zrobiły tego w tym scenariuszu, ale nie wiem, czy było to przeoczenie, czy nie.
Scenariusz 3: przejście z jednego nadrzędnego kontrolera widoku na inny
Prawdopodobnie nastąpi to w następujący sposób, ponieważ logika w każdym nadrzędnym kontrolerze widoku zostanie hermetyzowana.
// In the old parent
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
// In the new parent
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view];
[vc didMoveToParentViewController:self];
pytania
Moje główne pytanie brzmi: czy w ogóle tak powinno działać ograniczenie kontrolera widoku? Czy mechanika podana powyżej jest poprawna?
Czy willMoveToParentViewControllerprzed dzwonieniem trzeba zadzwonić addChildViewController? Wydaje mi się to logicznym porządkiem, ale czy jest to absolutnie konieczne?
Czy didMoveToParentViewController:nilpo dzwonieniu trzeba dzwonić removeFromParentViewController?
addChildViewControllerpowinno być zrównoważone zdidMoveToParentViewControlleriwillMoveToParentViewControllerpowinno być równoważoneremoveFromParentViewController. To jest dokładnie to, czego szukałem. Nie jestem pewien, jak przegapiłem to w dokumentach.