Apa perbedaan antara -viewWillAppear: dan -viewDidAppear :?

131

Apa perbedaan antara -[UIViewController viewWillAppear:]dan -[UIViewController viewDidAppear:]?

PJR
sumber
1
terima kasih BoltClock, tapi tolong beri saya contoh keduanya jika mungkin ..
PJR
3
@BoltClock akan lebih baik jika itu benar. Saya menduga 15 orang yang secara terbalik membaca nama metode tetapi tidak pernah benar-benar mengukurnya ... Datang ke sini dari Google karena BUKAN perbedaan di antara mereka
Adam
1
Khususnya: parentView.viewDidAppear disebut A PANJANG WAKTU sebelum Apple benar-benar menampilkan parentView ... Apple pertama (secara atomis) mengecat semua subview ... dan jika Anda memiliki banyak subview, atau yang kompleks, maka "viewDidAppear" dapat disebut puluhan atau ratusan milidetik terlalu cepat :(.
Adam

Jawaban:

292

Secara umum, inilah yang saya lakukan:

1) ViewDidLoad - Setiap kali saya menambahkan kontrol ke tampilan yang harus muncul bersama dengan tampilan, segera, saya memasukkannya ke dalam metode ViewDidLoad. Pada dasarnya metode ini dipanggil setiap kali tampilan dimuat ke dalam memori. Jadi misalnya, jika pandangan saya adalah formulir dengan 3 label, saya akan menambahkan label di sini; pandangan tidak akan pernah ada tanpa bentuk-bentuk itu.

2) ViewWillAppear : Saya menggunakan ViewWillAppear biasanya hanya untuk memperbarui data pada formulir. Jadi, untuk contoh di atas, saya akan menggunakan ini untuk benar-benar memuat data dari domain saya ke dalam formulir. Pembuatan UIViews cukup mahal, dan Anda harus menghindari sebanyak mungkin melakukan itu pada metode ViewWillAppear, karena ketika dipanggil, itu berarti bahwa iPhone sudah siap untuk menunjukkan UIView kepada pengguna, dan apa pun yang Anda lakukan di sini akan memengaruhi kinerja dengan cara yang sangat terlihat (seperti animasi sedang tertunda, dll).

3) ViewDidAppear : Akhirnya, saya menggunakan ViewDidAppear untuk memulai utas baru untuk hal-hal yang akan membutuhkan waktu lama untuk dieksekusi, seperti misalnya melakukan panggilan layanan web untuk mendapatkan data tambahan untuk formulir di atas. Hal yang baik adalah karena tampilan sudah ada dan sedang ditampilkan kepada pengguna, Anda dapat menampilkan pesan "Menunggu" yang bagus kepada pengguna saat Anda mendapatkan data.

Chetan Bhalara
sumber
4
Maaf, tetapi apa yang Anda maksud dengan "memuat data dari domain saya ke dalam formulir" di viewWillAppear? Maksud Anda mengunduh melalui jaringan? Tapi Anda juga menyarankan unduh barang viewDidAppear?
Philip007
1
@ Philip007 Saya pikir Stack mengacu pada jenis domain ini: en.wikipedia.org/wiki/Domain-specific_modeling . Data diambil dari model Anda atau serupa.
dentarg
2
Jawaban ini harus ada dalam dokumen. Itu sangat membantu dalam memperjelas perbedaan antara ketiga metode. Terima kasih!
GangstaGraham
1
+1 Saya mengalami sedikit kebingungan memahami perbedaan antara ketiganya, tetapi Anda baru saja menyelesaikannya dengan lebih sempurna @ChetanBhalara
Chisx
@ ChetanBhalara tetapi jika Anda bekerja lama ViewDidAppearAnda akan dengan mudah membuat pengguna bingung tentang UI :)
hqt
46

viewDidLoad === >>> Masukkan kode inisialisasi Anda di sini. Jangan letakkan data dinamis yang dapat berubah selama siklus hidup tampilan. Jadi, jika Anda menarik data dari data inti, Anda tidak ingin melakukannya di sini jika ini bisa berubah selama umur tampilan. Misalnya: Anda memiliki pengontrol tab. Anda beralih dari tab1 ke tab2 dan mengubah sesuatu pada model di tab2. Jika Anda kembali ke tab1 dan kode model Anda selesai di viewDidLoad, ini tidak akan diperbarui (dengan asumsi Anda tidak menggunakan KVO atau NSFetchedResultsController, dll.).

viewWillAppear === >>> Ini disebut setiap kali tampilan akan muncul, apakah tampilan sudah ada dalam memori atau tidak. Masukkan kode dinamis Anda di sini, seperti logika model.

viewDidAppear === >>> Letakkan operasi mahal di sini yang hanya ingin Anda lakukan jika Anda yakin tampilan di layar, seperti panggilan jaringan.

Perhatikan: jika aplikasi Anda di latar belakang dan kembali ke latar depan Anda harus menangani ini menggunakan NSNotificationCenter. Saya menulis kode untuk itu di komentar di bawah. Anda mungkin berpikir viewWillAppear / viewDidAppear akan diaktifkan. Letakkan break point di sana dan mengujinya. Itu tidak menyala. Jadi, jika ada sesuatu yang berubah untuk aplikasi Anda saat itu di latar belakang Anda harus memperbarui yang menggunakan notifikasi.

smileBot
sumber
1
Apakah ViewWill atau ViewDid dapat dijalankan setiap kali Anda membatalkan aplikasi?
Astaga
2
@ Ya ampun Ini adalah pertanyaan yang bagus. Tidak ada yang dijalankan kecuali aplikasi dibunuh oleh sistem atau pengguna saat di latar belakang. Apa yang harus Anda lakukan untuk mendapat pemberitahuan ketika aplikasi dalam un-diminimalisasi adalah Anda harus menggunakan NSNotificationCenter dan addObserver untuk nama UIApplicationWillEnterForegroundNotification. Pemilih harus applicationWillEnterForeground: ia memiliki parameter NSNotification. Masukkan kode Anda dalam metode itu untuk memuat ulang data, dll. Yang dapat Anda lakukan adalah membuat metode muat ulang yang Anda panggil dari metode ini dan juga viewDidAppear jika mereka harus sama.
smileBot
2
@Jeef sesuatu seperti ini: - (void) viewDidLoad {[[NSNotificationCenter defaultCenter] addObserver: pemilih mandiri: @selector (applicationWillEnterForeground :) nama: UIApplicationWillEnterForegroundNotification objek: nil]; } - (void) applicationWillEnterForeground: (NSNotification *) notif {// menanggapi di sini dengan apa pun}
smileBot
12

The viewWillAppearmetode ini disebut sebelum memuat pandangan yang sebenarnya.

The viewDidAppearMetode disebut ketika tampilan sudah dimuat, dan Anda ingin menunjukkan sesuatu.

puneet kathuria
sumber
9

viewWillAppear:
■ Dipanggil sebelum tampilan ditambahkan ke hierarki tampilan windows
■ Dipanggil sebelum [vc.view layoutSubviews] (jika perlu)
viewDidAppear :
■ Dipanggil setelah tampilan ditambahkan ke hierarki tampilan
■ Dipanggil setelah [vc.view layoutSubviews] (jika diperlukan)

andyqee
sumber
7

Beberapa pengamatan:

  • The viewDidLoadMetode disebut ketika pandangan pertama dipakai. IBOutletreferensi dihubungkan pada saat ini telah dipanggil, tetapi tidak sebelumnya. The framepandang yang mungkin tidak bisa dimunculkan pada saat ini telah disebut, meskipun. Ini adalah tempat yang bagus untuk menambah / mengkonfigurasi subview dan kendala terkaitnya. Tetapi jika Anda melakukan konfigurasi framenilai secara manual berdasarkan dimensi tampilan utama, konfigurasi frame tersebut harus ditangguhkan hingga viewWillAppearatau viewDidLayoutSubviews.

  • The viewWillAppearmetode ini disebut ketika presentasi dari pandangan dalam tampilan hirarki adalah untuk start. Khususnya, ini disebut pada awal animasi (jika ada) dari presentasi tampilan. Temannya, viewWillDisappearjelas dipanggil ketika transisi dari pandangan ini dimulai.

  • The viewDidAppearmetode ini disebut ketika presentasi dari pandangan dilakukan, terutama ketika setiap dan semua animasi terkait telah selesai. Temannya, viewDidDisappearjelas dipanggil ketika transisi dari pandangan ini dilakukan.

Dua peringatan penting:

  • viewDidLoaddisebut sekali dan hanya sekali, ketika tampilan pertama kali dipakai. Di sisi lain, viewWillAppeardan viewDidAppearakan dipanggil tidak hanya ketika tampilan pertama kali disajikan, tetapi setiap kali berikutnya tampilan yang sama dipertanyakan kembali disajikan. Misalnya, saat Anda pertama kali menampilkan tampilan, ketiga metode ini akan dipanggil. Jika tampilan yang dipermasalahkan selanjutnya menyajikan tampilan lain yang kemudian dibubarkan, maka viewWillAppeardan viewDidAppearbiasanya akan dipanggil lagi ketika tampilan yang dipermasalahkan ditambahkan dan dianimasikan kembali ke hierarki tampilan, tetapi viewDidLoadtidak akan. viewDidLoadhanya dipanggil ketika instance khusus ini pertama kali dibuat.

    Jadi, jika Anda ingin melakukan sesuatu setiap kali tampilan muncul kembali (mis. Anda mengabaikan atau pop kembali ke sana), lakukan di viewWillAppearatau viewDidAppear. Jika Anda ingin itu hanya terjadi ketika tampilan pertama kali dipakai, lakukan itu di viewDidLoad.

  • Panggilan dari viewWillAppeartidak menjamin bahwa transisi ke pandangan itu akan pernah selesai. Khususnya, jika Anda menggunakan transisi interaktif yang didorong oleh input pengguna waktu nyata, tetapi transisi interaktif itu dapat dibatalkan. Yaitu, hanya karena viewWillAppeardipanggil, bukan berarti viewDidAppearakan dipanggil. Secara umum, tetapi jika gerakan interaktif dibatalkan, itu tidak akan terjadi (karena transisi tidak pernah selesai).

    Pada WWDC 2013, dalam konteks transisi interaktif, seorang presenter bercanda bahwa mereka harus berganti nama viewWillAppearmenjadi " viewMightAppear, atau viewWillProbablyAppear, atau iReallyWishThisViewWouldAppear".

    Contoh dari gerakan interaktif built-in adalah ketika menggunakan UINavigationControllerdan Anda "menggesek dari tepi kiri" untuk memulai pop tampilan. The viewWillAppearakan dipanggil untuk tampilan yang Anda bermunculan, tetapi jika Anda membatalkan bahwa "swipe dari ujung kiri" untuk kembali ke tampilan dari mana Anda memulai gerakan pop ini, pop tersebut dibatalkan dan viewDidAppearuntuk pandangan Anda mulai pop kembali ke tidak akan pernah dipanggil.

    Efek bersih dari ini adalah bahwa Anda harus berhati-hati bahwa Anda tidak menulis kode yang mengasumsikan bahwa setiap panggilan viewWillAppearakan diikuti pada akhirnya oleh panggilan untuk viewDidAppear. Jika transisi dibatalkan, ini tidak akan terjadi.

rampok
sumber
5

viewwillappear akan memanggil sebelum memuat tampilan sehingga Anda dapat melakukan tugas tertentu sebelum memuat tampilan itu dan viewdidappear akan memanggil setelah memuat tampilan sehingga tugas posting akan dilakukan dalam metode itu

dks1725
sumber
4

Perbedaan antara "akan" dan "melakukan" ... Seperti namanya, viewWillAppear dipanggil sebelum tampilan akan muncul dan viewDidAppear dipanggil saat tampilan muncul.

Mahesh
sumber
lihat bro jawaban yang diterima, yang berisi 70+ upvotes. :)
PJR
4

1) ViewWillAppear : Tampilan dimuat sebenarnya dalam memori, dipanggil sekali di view controller dan memiliki bingkainya, tetapi masih tidak tampak oleh pengguna

2) ViewDidAppear : Kontroler ditambahkan ke hierarki tampilan, sehingga Anda dapat menyajikan ke controller berikutnya, juga, tampilan melakukan tata letak subviews

Abuzeid Ibrahim
sumber
3

Yang pertama terjadi sebelum tampilan muncul dan yang terakhir terjadi sesudahnya.

Marc Abramowitz
sumber
3

Untuk menyimpulkan:

-viewWillAppear -> memperbarui data (memuat ulang data dari tampilan tabel)

-viewDidAppear -> operasi mahal (panggilan API dengan kemajuan yang bagus!)

Nahuel Roldan
sumber
1

Seperti namanya menyarankan viewWillAppeardipanggil sebelum tampilan akan muncul dan viewDidAppeardipanggil ketika tampilan memang muncul.

visakh7
sumber
0

Usase , yaitu kapan saya harus menggunakan yang mana?

viewDidLoad - ketika label, tombol (i, e kontrol / subview apa pun) terhubung ke file antarmuka View dan jika Anda ingin memuat semua ini pada waktu yang sama dengan ViewController's View, dan jika Anda ingin memuat ini ke dalam memori satu kali dan menjadi selesai dengan itu

viewWillAppear- katakanlah, Anda ingin mengubah warna latar belakang tampilan setiap kali viewController muncul di layar. Atau lebih realistis jika Anda ingin warna latar belakang DarkMode di waktu malam hari, dan warna terang dari tampilan latar belakang di siang hari, buka kode ini diviewWillAppear

Penggunaan lain yang bagus di sini https://stackoverflow.com/a/39395865/5438240

Juga perhatikan bahwa, jika Anda menggunakan tumpukan Navigasi ( UINavigationController), viewController yang akan muncul memiliki panggilan viewWillDisappear(), dan ViewController yang selanjutnya akan berada di atas tumpukan akan viewWillAppear()memanggil

Naishta
sumber