2012-10-16 13 views
18

Wiem, że począwszy od iOS5 i nowych metod zapobiegania UIViewController, należy wywoływać te metody wraz z addChildViewController:, removeFromParentViewController: i metody przejścia. Znam również właściwą kolejność wywoływania ich w trzech scenariuszach. Czego nie wiem, co dokładnie robią te metody?Co dokładnie willMoveToParentViewController: i didMoveToParentViewController: zrobić?

Jeśli były to tylko punkty zastępcze dla podklas UIViewController, to chyba nadpisujemy super podczas przesłonięcia. Co może/pójdzie źle, jeśli nie zadzwonię pod numer willMoveToParentViewController: nil przed usunięciem kontrolera widoku lub didMoveToParentViewController: self?

Odpowiedz

13

Oprócz tego, co zostało powiedziane, robią zadzwonić kilka metod Delegat:

addChildViewController połączeń [child willMoveToParentViewController:self]

i removeFromParentViewController: połączeń [child didMoveToParentViewController:nil]

Również one modyfikować właściwości childViewControllers, który posiada tablicę kontrolerów widoku dziecka.

+2

Tak, wiem, "dodaj" i "usuń" wywołuje jedną metodę automatycznie (odpowiednio willMove ... i didMove ...) i wymaga ręcznego połączenia z drugą. Myślę, że nie mam problemu ze zrozumieniem, co robią "dodaj" i "usuń" - wygląda na to, że jest to dość niewygodne. Po prostu czuję się nieco zdezorientowany, co właściwie robią "wola" i "czy". – konrad

+2

"Wola" i "zrobił" nie mają szczególnej implementacji, wywołujesz je na kontrolerze dziecięcym, a jeśli nie, to po prostu nie są nazywane ... co może stanowić problem, jeśli dziecko kontroler je wdrożył i polegał na nich. W mojej odpowiedzi omyłkowo nazywam je "metodami delegowanymi", ale to prawie to, czym one są, funkcjonują jako opcjonalne metody delegatów, a dziecko może je wykorzystać do przeprowadzenia pewnych ustawień lub czyszczenia. Każda podklasa UIViewController może je zastąpić, a jeśli zaimplementujesz kontroler kontenera, powinieneś uszanować to zachowanie i wywołać je. – Guillaume

+3

Aby było jasne, UIViewController 'willMoveToParentViewController:' i 'didMoveToParentViewController:' nic nie rób. Jednak każda podklasa pozwala na ich przesłonięcie, więc jeśli nie będziesz ich wywoływał, nie złamiesz nagiego UIViewController, ale złamiesz podklasy, które na nim polegają (na przykład: powiedz, że podklasa chce zwolnić obiekt, gdy zostanie usunięty z nadrzędnego kontrolera widoku, jeśli nie wywołasz tej metody, to nigdy nie zwolni obiektu). – Guillaume

0

Istnieje wiele odpowiedzi na to:

  1. Są tam i mają do nich zadzwonić w razie potrzeby zawsze podtrzymywać wzór. W ten sposób, jeśli zmienisz klasę nadrzędną z UIViewController na swój kontroler widoku, nie będziesz musiał się martwić, gdzie podążasz za całym wzorcem.

  2. Są lepszymi miejscami, w które można się podłączyć, niż informować wszystkich o zastąpieniu addChildViewController:. Jak mówisz, błędne zarządzanie willMoveToParentViewController: brzmi, jakby było mniej niebezpieczne niż błędne zmienianie addChildViewController:, szczególnie jeśli zapomnisz zadzwonić pod numer super.

  3. UIViewController Prawdopodobnie zależy od Ciebie zachowanie wzorca. Może uzna to stan za niekonsekwentny, jeśli wie, że otrzymał addChildViewController:, ale nigdy nie otrzyma pozostałych dwóch wiadomości. Niezależnie od tego, czy dzieje się tak z powodu UIViewController prowadzenia ksiąg rachunkowych, aby zwabić Cię do podtrzymywania pełnego schematu, czy naprawdę zepsuć jego stan wewnętrzny jest zabawną zgadywanką, ale także coś, co może się zmienić w dowolnym wydaniu na iOS. Sprawy mogą się bardzo źle zepsuć. Właśnie dlatego istnieje ten wzór, ponieważ Apple powie Ci, że dopóki to zrobisz, będziemy działać bez względu na wszystko.

Kwestionowanie wzoru jest dobre, ale istnieje wiele potencjalnych negatywów, które przychodzą z próbą zmniejszenia zgodności wzoru z kością. Chyba że wzór jest niedorzecznie zaangażowany, zwykle łatwiej jest go dopasować.

+2

Nie chcę kwestionować używania tych metod. Jeśli doktorzy Apple mówią "musisz" do nich zadzwonić, to z pewnością jest ku temu powód. Mam tylko nadzieję, że ktoś z nieco większym doświadczeniem i wiedzą na temat mechanizmu zagnieżdżania UIViewControllers wyjaśni to nieco bardziej szczegółowo niż oficjalne dokumenty, które tylko mówią, że "informuje" kontrolkę podglądu podrzędnego o zmianie. Moją teorią jest to, że pozwala to na pewne przygotowanie i czyszczenie, jeśli chcesz, aby przejście było animowane, ale to tylko domysły. – konrad

+0

Och, właśnie to będzie używane, jeśli podklasujesz 'UIViewController'. Chodzi mi o to, że nawet gdyby to nie miało nic wspólnego, wiedząc, że to nie sprawi, że nazwiesz "super" coś, czego powinieneś unikać. Może najlepiej podsumować to "sprawia, że ​​jest o wiele mniej brudny, ponieważ nie będziesz musiał przesłonić' addChildViewController: '" (punkt 2). – Jesper

Powiązane problemy