W WWDC 2011 Session 102, Apple wprowadził View Controller obudowy, która jest zdolność do tworzenia niestandardowego widoku pojemników kontrolera, analogicznie do UITabBarController
, UINavigationController
i 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 willMoveToParentViewController
przed dzwonieniem trzeba zadzwonić addChildViewController
? Wydaje mi się to logicznym porządkiem, ale czy jest to absolutnie konieczne?
Czy didMoveToParentViewController:nil
po dzwonieniu trzeba dzwonić removeFromParentViewController
?
źródło
addChildViewController
powinno być zrównoważone zdidMoveToParentViewController
iwillMoveToParentViewController
powinno być równoważoneremoveFromParentViewController
. To jest dokładnie to, czego szukałem. Nie jestem pewien, jak przegapiłem to w dokumentach.Ta część jest nieprawidłowa:
Według dokumentów:
Więc nie potrzebujesz
[vc willMoveToParentViewController:self]
telefonu. Odbywa się to automatycznie, gdy dzwonisz[self addChildViewController:vc]
. Oto ponownie przykładowy kod:Aby usunąć kontrolery widoku:
Prawdopodobnie to wezwanie
[oldVC didMoveToParentViewController:nil]
.źródło
didMoveToParentViewController
„ natychmiast po wywołaniu metody addChildViewController:”, ale nie określa, kiedy faktycznie dodajesz podwidok podrzędny. Zastanawiam się, czy wszyscy się mylili. Czy jest przykład w niektórych dokumentach Apple Docs, na podstawie których możemy to sprawdzić?willMoveToParentViewController
przedaddChildViewController
jeżeli rzecz poruszają to klasa zwyczaj z przesłonięteaddChildViewController
(chyba że przesłanianie nazywa ją wewnętrznie)