Podczas konferencji WWDC 2011 Session 102 firma Apple wprowadziła kontroler View Control, który umożliwia tworzenie niestandardowych kontenerów kontrolerów widoku analogicznych do UITabBarController
, UINavigationController
i tym podobnych.Jak działa kontroler przeglądania w systemie iOS 5?
Obejrzałem przykłady kilka razy. Istnieje wiele metod związanych z tym wzorcem, ale trochę trudno było je dokładnie obliczyć. Zamierzam opublikować tutaj, o czym myślę, że się dzieje i zobaczyć, czy społeczność potwierdzi lub odrzuci moje podejrzenia.
Scenariusz 1: Przejście z żadnym z rodziców do nowego kontrolera widoku rodzica
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];
Czy dwie pierwsze linie muszą wystąpić w podanej kolejności, lub mogą zostać odwrócone?
Scenariusz 2: Przejście z kontrolera do widoku macierzystego bez widoku nadrzędnego kontrolera
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
Jest to również konieczne, aby zadzwonić [vc didMoveToParentViewController:nil]
? Przykłady w sesji 102 nie zrobiły tego w tym scenariuszu, ale nie wiem, czy było to pominięcie, czy nie.
Scenariusz 3: Przejście z jednego nadrzędnego kontrolera widoku do innego
To prawdopodobnie pojawią się w następujący sposób, ponieważ logika w każdym widoku nadrzędnego regulatora zostanie zamknięta.
// 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 to jak powstrzymywanie widok kontroler powinien działać w ogóle? Czy powyższa mechanika jest poprawna?
Czy należy dzwonić pod numer willMoveToParentViewController
przed dzwonieniem pod numer addChildViewController
? Wydaje mi się to logicznym porządkiem, ale czy jest to absolutnie konieczne?
Czy po zadzwonieniu pod numer removeFromParentViewController
należy zadzwonić pod numer didMoveToParentViewController:nil
?
Problem polegał na tym, że gdy próbowałem dodać tag ios5, przypadkowo nacisnąłem klawisz enter, który dodał wpis, mimo że nie ukończyłem jego komponowania/edycji. Próbowałem go usunąć, ale potem stwierdziłem, że mogę tylko * głosować *, aby go usunąć. –