Różnica między viewDidLoad i viewDidAppear

Odpowiedzi:

147

viewDidLoadjest wywoływana dokładnie raz, kiedy kontroler widoku jest po raz pierwszy ładowany do pamięci. W tym miejscu chcesz utworzyć wystąpienie dowolnych zmiennych instancji i zbudować dowolne widoki, które istnieją przez cały cykl życia tego kontrolera widoku. Jednak widok zwykle nie jest jeszcze widoczny w tym momencie.

viewDidAppearjest wywoływana, gdy widok jest rzeczywiście widoczny, i może być wywoływana wiele razy podczas cyklu życia kontrolera widoku (na przykład, gdy modalny kontroler widoku jest odrzucany i widok staje się ponownie widoczny). Tutaj chcesz wykonać dowolne czynności dotyczące układu lub wykonać dowolny rysunek w interfejsie użytkownika - na przykład prezentując kontroler widoku modalnego. Jednak wszystko, co tu robisz, powinno być powtarzalne. Najlepiej nie przechowywać tutaj rzeczy, bo inaczej dostaniesz wycieki pamięci, jeśli nie zwolnisz ich, gdy widok zniknie.

Zobacz: https://developer.apple.com/documentation/uikit/uiviewcontroller

davidgoli
źródło
15
Ty i WrightsCS macie absolutną rację. Ale nie do dzielenia włosów, ale chociaż viewDidLoadjest generalnie wywoływany tylko raz i tylko raz, jest jedna sytuacja, w której można to wywołać ponownie. W szczególności, jeśli kiedykolwiek otrzymasz didReceiveMemoryWarning, twoje niewidoczne widoki mogą zostać zwolnione (chociaż kontrolery widoku są nietknięte), a kiedy wrócisz, viewDidLoadmogą zostać ponownie wezwane.
Rob
1
Nie jestem pewien, czy zgadzam się z komentarzem na temat Ivars widok kontrolera zawsze i automatycznie zwolniony za ciebie (sam regulator nie wydany). Podejrzewam, że oboje moglibyśmy łatwo skonstruować viewDidLoad, który przeciekałby, gdyby został ponownie wywołany po didReceiveMemoryWarning. Ale zgadzam się, że jeśli piszesz swoje dobre praktyki viewDidLoad, wszystko powinno być w porządku. Chodzi mi tylko o to, że niechlujne używanie ivarów i ręczne zarządzanie pamięcią może z pewnością skutkować wyciekami viewDidLoad. Ludzie powinni być wrażliwi na didReceiveMemoryWarningscenariusz i odpowiednio programować.
Rob
2
Nie żeby rozwodzić się nad tym tematem, ale mniej niż 24 godziny po tej wymianie, odpowiadając na inne pytanie , znalazłem przykład dokładnie tego rodzaju viewDidLoadkodu, który wycieknie didReceiveMemoryWarning. Westchnienie.
Rob
1
Ta odpowiedź bezpośrednio zaprzecza tej drugiej: stackoverflow.com/a/3411636/269753 Obserwowałem, jak moja metoda viewDidLoad była wywoływana więcej niż jeden raz, nawet jeśli w ogóle nie otrzymywałem ostrzeżeń dotyczących pamięci. Czy ktoś chce wyjaśnić?
Ricardo Sanchez-Saez
2
Nie widzę sprzeczności. To pytanie dotyczy relacji między viewDidLoad i viewDidUnload, a nie viewDidAppear.
davidgoli
21

Mówiąc najprościej, chciałbyś utworzyć dowolne kontrolki lub tablice w viewDidLoad, gdzie tak jak w viewDidAppear, chcesz odświeżyć te kontrolki lub tablice.

viewDidLoadjest wywoływana raz podczas tworzenia kontrolera i viewDidAppearwywoływana za każdym razem, gdy widok, no cóż, pojawi się DID. Powiedz więc, że masz pogląd modalny, który przedstawiasz, kiedy ten widok zostanie odrzucony, viewDidAppearzostanie wywołany i viewDidLoadnie zostanie wywołany.

WrightsCS
źródło
3
Pierwszy akapit to ładnie ujęta wskazówka. Ale drugi akapit jest nieprawidłowy. viewDidLoadmożna dzwonić więcej niż jeden raz . Jeśli widok, który nie jest wyświetlany (pod stosem innych widoków), jest rozładowywany przez starsze wersje systemu iOS w sytuacji o małej ilości pamięci, wówczas kontroler widoku automatycznie załaduje widok ponownie, gdy trzeba będzie ponownie wyświetlić go na ekranie. W późniejszych wersjach iOS możesz zmniejszyć zużycie pamięci, robiąc to, co zrobił wcześniej iOS: Zwolnij widoki pozaekranowe po didReceiveMemoryWarningnadejściu wiadomości, w którym to przypadku viewDidLoadzostanie wywołany ponownie.
Basil Bourque
@WrightsCS Czy masz jakiś oficjalny dokument firmy Apple, który to mówi? „ViewDidLoad jest wywoływane raz podczas tworzenia kontrolera” Ponieważ pamiętam, że w przeszłości viewDidLoad można było wywołać kilka razy w scenariuszach z małą ilością pamięci. Wielkie dzięki.
Ricardo