Perbedaan antara viewDidLoad dan viewDidAppear

Jawaban:

148

viewDidLoaddipanggil tepat sekali, saat pengontrol tampilan pertama kali dimuat ke memori. Di sinilah Anda ingin membuat instance variabel instance apa pun dan membuat tampilan apa pun yang aktif selama seluruh siklus pengontrol tampilan ini. Namun, pemandangan biasanya belum terlihat pada saat ini.

viewDidAppeardipanggil saat tampilan benar-benar terlihat, dan dapat dipanggil beberapa kali selama siklus hidup Pengontrol Tampilan (misalnya, saat Modal View Controller ditutup dan tampilan menjadi terlihat lagi). Di sinilah Anda ingin melakukan tindakan tata letak atau menggambar apa pun di UI - misalnya, menampilkan pengontrol tampilan modal. Namun, apa pun yang Anda lakukan di sini harus dapat diulang. Sebaiknya jangan menyimpan sesuatu di sini, atau Anda akan mendapatkan kebocoran memori jika Anda tidak melepaskannya saat tampilan menghilang.

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

davidgoli.dll
sumber
15
Anda dan WrightsCS benar sekali. Tapi, bukan untuk membelah rambut, tapi meski viewDidLoadumumnya hanya dipanggil sekali dan hanya sekali, ada satu situasi di mana bisa dipanggil lagi. Khususnya, jika Anda pernah menerima didReceiveMemoryWarning, tampilan yang tidak terlihat mungkin dirilis (meskipun pengontrol tampilan tidak tersentuh) dan saat Anda kembali, viewDidLoadmungkin akan dipanggil lagi.
Rob
1
Saya tidak yakin apakah saya setuju dengan komentar tentang tampilan pengontrol ivars selalu dan secara otomatis dirilis untuk Anda (pengontrol itu sendiri tidak dirilis). Saya menduga kami berdua dapat dengan mudah membuat viewDidLoad yang akan bocor jika dipanggil kembali setelah didReceiveMemoryWarning. Tetapi saya setuju bahwa jika Anda menerapkan praktik yang baik saat menulis Anda viewDidLoad, Anda akan baik-baik saja. Satu-satunya poin saya adalah bahwa penggunaan ivars yang ceroboh dan manajemen memori manual pasti dapat menyebabkan kebocoran viewDidLoad. Orang harus peka terhadap didReceiveMemoryWarningskenario dan program yang sesuai.
Rob
2
Bukan untuk memperinci intinya, tetapi kurang dari 24 jam setelah pertukaran ini, saat menjawab pertanyaan lain , saya menemukan contoh persis jenis viewDidLoadkode yang akan bocor didReceiveMemoryWarning. Mendesah.
Rob
1
Jawaban ini secara langsung bertentangan dengan yang lain ini: stackoverflow.com/a/3411636/269753 Saya telah mengamati metode viewDidLoad saya dipanggil lebih dari sekali, bahkan ketika tidak menerima peringatan memori sama sekali. Ada yang ingin mengklarifikasi?
Ricardo Sanchez-Saez
2
Saya tidak melihat adanya kontradiksi. Pertanyaan itu tentang hubungan antara viewDidLoad dan viewDidUnload, bukan viewDidAppear.
davidgoli
21

Sederhananya, Anda ingin membuat kontrol atau array apa pun viewDidLoad, di viewDidAppearmana Anda ingin menyegarkan kontrol atau array tersebut.

viewDidLoaddipanggil sekali saat pengontrol dibuat dan viewDidAppeardipanggil setiap kali tampilan, yah, DID muncul. Jadi katakanlah Anda memiliki tampilan modal yang Anda sajikan, saat tampilan itu ditutup, viewDidAppearakan dipanggil, dan viewDidLoadtidak akan dipanggil.

WrightsCS
sumber
3
Paragraf pertama adalah tip yang bagus. Tapi paragraf kedua tidak benar. viewDidLoadbisa dipanggil lebih dari sekali . Jika tampilan Anda saat tidak ditampilkan (di bawah tumpukan tampilan lain) dibongkar oleh versi iOS yang lebih lama dalam situasi memori rendah, maka pengontrol tampilan akan secara otomatis memuat ulang tampilan saat perlu ditampilkan ulang di layar. Di versi iOS yang lebih baru, Anda dapat memilih untuk membantu mengurangi penggunaan memori dengan melakukan apa yang dilakukan iOS sebelumnya untuk Anda: Bongkar tampilan di luar layar saat didReceiveMemoryWarningpesan tiba, dalam hal viewDidLoadini akan dipanggil lagi.
Basil Bourque
@WrightsCS apakah Anda memiliki dokumen resmi Apple yang mengatakan itu? "viewDidLoad dipanggil satu kali saat pengontrol dibuat" Karena saya ingat di masa lalu viewDidLoad dapat dipanggil beberapa kali dalam skenario memori rendah. Terima kasih banyak.
Ricardo