Apa perbedaan antara -[UIViewController viewWillAppear:]
dan -[UIViewController viewDidAppear:]
?
Apa perbedaan antara -[UIViewController viewWillAppear:]
dan -[UIViewController viewDidAppear:]
?
Jawaban:
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.
viewWillAppear
? Maksud Anda mengunduh melalui jaringan? Tapi Anda juga menyarankan unduh barang viewDidAppear
?
ViewDidAppear
Anda akan dengan mudah membuat pengguna bingung tentang UI :)
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.
The viewWillAppear
metode ini disebut sebelum memuat pandangan yang sebenarnya.
The viewDidAppear
Metode disebut ketika tampilan sudah dimuat, dan Anda ingin menunjukkan sesuatu.
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)
Beberapa pengamatan:
The viewDidLoad
Metode disebut ketika pandangan pertama dipakai. IBOutlet
referensi dihubungkan pada saat ini telah dipanggil, tetapi tidak sebelumnya. The frame
pandang 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 frame
nilai secara manual berdasarkan dimensi tampilan utama, konfigurasi frame tersebut harus ditangguhkan hingga viewWillAppear
atau viewDidLayoutSubviews
.
The viewWillAppear
metode ini disebut ketika presentasi dari pandangan dalam tampilan hirarki adalah untuk start. Khususnya, ini disebut pada awal animasi (jika ada) dari presentasi tampilan. Temannya, viewWillDisappear
jelas dipanggil ketika transisi dari pandangan ini dimulai.
The viewDidAppear
metode ini disebut ketika presentasi dari pandangan dilakukan, terutama ketika setiap dan semua animasi terkait telah selesai. Temannya, viewDidDisappear
jelas dipanggil ketika transisi dari pandangan ini dilakukan.
Dua peringatan penting:
viewDidLoad
disebut sekali dan hanya sekali, ketika tampilan pertama kali dipakai. Di sisi lain, viewWillAppear
dan viewDidAppear
akan 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 viewWillAppear
dan viewDidAppear
biasanya akan dipanggil lagi ketika tampilan yang dipermasalahkan ditambahkan dan dianimasikan kembali ke hierarki tampilan, tetapi viewDidLoad
tidak akan. viewDidLoad
hanya 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 viewWillAppear
atau viewDidAppear
. Jika Anda ingin itu hanya terjadi ketika tampilan pertama kali dipakai, lakukan itu di viewDidLoad
.
Panggilan dari viewWillAppear
tidak 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 viewWillAppear
dipanggil, bukan berarti viewDidAppear
akan 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 viewWillAppear
menjadi " viewMightAppear
, atau viewWillProbablyAppear
, atau iReallyWishThisViewWouldAppear
".
Contoh dari gerakan interaktif built-in adalah ketika menggunakan UINavigationController
dan Anda "menggesek dari tepi kiri" untuk memulai pop tampilan. The viewWillAppear
akan 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 viewDidAppear
untuk 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 viewWillAppear
akan diikuti pada akhirnya oleh panggilan untuk viewDidAppear
. Jika transisi dibatalkan, ini tidak akan terjadi.
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
Yang pertama terjadi sebelum tampilan muncul dan yang terakhir terjadi sesudahnya.
Untuk menyimpulkan:
-viewWillAppear -> memperbarui data (memuat ulang data dari tampilan tabel)
-viewDidAppear -> operasi mahal (panggilan API dengan kemajuan yang bagus!)
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