2009-10-16 15 views
146

Zawsze byłem trochę niejasny odnośnie rodzaju zadań, które powinny być przypisane do viewDidLoad vs. viewWillAppear: w podklasie UIViewController.UIViewController viewDidLoad vs. viewWillAppear: Jaki jest właściwy podział pracy?

np. Robię aplikację, w której mam podklasę UIViewController trafiającą na serwer, pobierającą dane, zasilającą ją do widoku, a następnie wyświetlającą ten widok. Jakie są plusy i minusy robienia tego w viewDidLoad vs. viewWillAppear?

Odpowiedz

236

viewDidLoad to rzeczy, które musisz zrobić raz. viewWillAppear jest wywoływana za każdym razem, gdy pojawia się widok. Powinieneś robić rzeczy, które musisz zrobić tylko raz w viewDidLoad - jak ustawianie twoich tekstów UILabel. Możesz jednak zmodyfikować określoną część widoku za każdym razem, gdy użytkownik ją zobaczy, np. aplikacja iPoda przewija tekst do początku za każdym razem, gdy przejdziesz do widoku "Teraz odtwarzane".

Jednak, gdy ładujesz elementy z serwera, musisz również pomyśleć o opóźnieniu. Jeśli zapakujesz całą komunikację sieciową do viewDidLoad lub viewWillAppear, zostaną wykonane zanim użytkownik zobaczy widok - co może skutkować krótkim zamrożeniem aplikacji. Dobrym pomysłem może być najpierw pokazanie użytkownikowi nieopancerzonego widoku za pomocą jakiegoś wskaźnika aktywności. Kiedy skończysz pracę w sieci, która może zająć sekundę lub dwie (lub nawet może się nie powieść - kto wie?), Możesz wypełnić widok swoimi danymi. Dobre przykłady tego, jak można to zrobić, można zobaczyć u różnych klientów Twittera. Na przykład, gdy przeglądasz stronę szczegółów autora w witrynie Twitterrific, widok wyświetla tylko "Ładowanie ...", aż do zakończenia zapytań sieciowych.

+0

W związku z tym, że viewWillAppear potencjalnie jest wywoływany wielokrotnie. Czy ta metoda byłaby uruchomiona, gdyby na przykład widok viewcontrollers stał się widoczny po ukryciu (to znaczy okludowanym tutaj, a nie ukrytej metodzie na UIView). W jakim scenerii widok viewAppear byłby wywoływany bez poprzedzania wywołaniem viewDidLoad? – dugla

+5

viewDidLoad TYLKO zostaje wywołany podczas konstruowania widoku - na przykład po wywołaniu kontrolera initFromNibNamed kontrolera widoku, gdy widok jest dostępny. viewWillAppear wywoływany jest za każdym razem, gdy kontroler podglądu nie był widoczny, ale jest widoczny - więc gdy kontroler widoku jest wciśnięty, wywoływana jest funkcja viewWillAppear. Jeśli naciśniesz inny widok, a użytkownik powróci, funkcja viewWillAppear zostanie wywołana ponownie. –

+0

Dzięki Kendall. Yah, kilka strategicznie rozmieszczonych NSLogów kazało mi posortować. viewWillAppear/viewWillDiss wyświetla się na viewcontroller push/pops. – dugla

11

Początkowo używane tylko ViewDidLoad z tableView. Podczas testowania z utratą połączenia Wi-Fi, ustawiając urządzenie w tryb samolotowy, zdało sobie sprawę, że tabela nie odświeżyła się wraz z powrotem do sieci Wi-Fi. W rzeczywistości wydaje się, że nie ma sposobu na odświeżenie tableView na urządzeniu nawet poprzez naciśnięcie przycisku home z trybem tła ustawionym na YES w -Info.plist.

Moje rozwiązanie:

-(void) viewWillAppear: (BOOL) animated { [self.tableView reloadData];} 
10

Ważne jest, aby pamiętać, że za pomocą viewDidLoad do pozycjonowania jest nieco ryzykowne i należy unikać, ponieważ granice nie są ustawione. może to spowodować nieoczekiwane wyniki (miałem różne problemy ...)

This post opisuje całkiem dobrze różne metody i to, co dzieje się w każdym z nich.

Obecnie dla jednorazowego init i pozycjonowania Myślę o użyciu viewDidAppear z flagą, jeśli ktoś ma jakieś inne zalecenie, proszę dać mi znać.

+0

zgadzam się z tym: "... powinno się unikać, ponieważ granice nie są ustawione ..." – danisupr4

3

Zależy, czy potrzebujesz danych do załadowania przy każdym otwarciu widoku? lub tylko raz?

enter image description here

  • Red: Nie wymagają one zmieniać za każdym razem. Po załadowaniu pozostają tak, jak były.
  • Fioletowa: Muszą się zmieniać z biegiem czasu lub po załadowaniu za każdym razem. Nie chcesz widzieć tych samych 3 sugerowanych użytkowników, więc musisz je ponownie wczytać za każdym razem, gdy wrócisz na ekran. Ich zdjęcia mogą zostać zaktualizowane ... nie chcesz widzieć zdjęcia sprzed 5 lat ...

viewDidLoad: Cokolwiek przetwarzanie trzeba, że ​​należy zrobić raz.
viewWilLAppear: Niezależnie od przetwarzania, które należy zmienić za każdym razem, gdy strona zostanie załadowana.

Etykiety, ikony, tytuły przycisków lub większość danychInputedByDeveloper zwykle nie zmieniają się. Nazwy, zdjęcia, linki, status przycisku, listy (wejściowe Tablice dla twojej tablicy Widoki lub kolekcjeView) lub większość danychInputedByUser zwykle zmieniają się.

Powiązane problemy