UIViewController viewDidLoad vs. viewWillAppear: Apa pembagian kerja yang tepat?

164

Saya selalu sedikit tidak jelas tentang jenis tugas yang harus ditugaskan viewDidLoadvs viewWillAppear: di UIViewControllersubkelas.

misalnya saya sedang melakukan aplikasi di mana saya memiliki UIViewControllersubclass yang memukul server, mendapatkan data, mengumpankannya ke tampilan dan kemudian menampilkan tampilan itu. Apa pro dan kontra dari melakukan hal ini di viewDidLoadvs viewWillAppear?

dugla
sumber

Jawaban:

251

viewDidLoad adalah hal yang harus Anda lakukan sekali. viewWillAppear dipanggil setiap kali tampilan muncul. Anda harus melakukan hal-hal yang hanya perlu Anda lakukan sekali di viewDidLoad - seperti mengatur teks UILabel Anda. Namun, Anda mungkin ingin memodifikasi bagian tertentu dari tampilan setiap kali pengguna melihatnya, misalnya aplikasi iPod menggulirkan lirik kembali ke atas setiap kali Anda pergi ke tampilan "Now Playing".

Namun, ketika Anda memuat sesuatu dari server, Anda juga harus memikirkan latensi. Jika Anda mengemas semua komunikasi jaringan Anda ke dalam viewDidLoad atau viewWillAppear, mereka akan dieksekusi sebelum pengguna dapat melihat tampilan - mungkin mengakibatkan pembekuan singkat aplikasi Anda. Mungkin ide yang baik untuk pertama kali menunjukkan kepada pengguna tampilan yang tidak berpenghuni dengan semacam indikator aktivitas. Ketika Anda selesai dengan jaringan Anda, yang mungkin memakan waktu satu atau dua detik (atau bahkan mungkin gagal - siapa tahu?), Anda dapat mengisi tampilan dengan data Anda. Contoh bagus tentang bagaimana ini bisa dilakukan dapat dilihat di berbagai klien twitter. Misalnya, ketika Anda melihat halaman detail penulis di Twitterrific, tampilan hanya mengatakan "Memuat ..." sampai permintaan jaringan selesai.

LeonBrussels
sumber
Jadi, mengenai viewWillAppear berpotensi dipanggil berulang kali. Apakah metode itu akan menyala jika, misalnya, tampilan viewcontrollers menjadi terlihat setelah disembunyikan (maksud saya tersumbat di sini, bukan metode tersembunyi di UIView). Dalam scenerio apa yang akan disebut viewWillAppear dipanggil tanpa didahului oleh panggilan untuk viewDidLoad?
dugla
7
viewDidLoad ONLY dipanggil ketika view dibangun - jadi misalnya setelah view controller memanggil initFromNibNamed ketika view diakses. viewWillAppear dipanggil kapan saja view controller Anda tidak dalam tampilan tetapi muncul - jadi ketika view controller Anda didorong, viewWillAppear dipanggil. Jika Anda menekan subview lain dari sana, dan pengguna kembali, viewWillAppear dipanggil lagi.
Kendall Helmstetter Gelner
Terima kasih Kendall. Yah, beberapa NSLogs yang ditempatkan secara strategis membuat saya diurutkan. viewWillAppear / viewWillDissappear menyalakan api viewcontroller / muncul.
dugla
3
Perhatikan bahwa viewDidLoad juga akan dipanggil jika tampilan disembunyikan dan kemudian dibongkar karena alasan yang berhubungan dengan memori, kemudian muncul kembali. Yang dapat Anda andalkan: viewDidLoad akan disebut SETIDAKNYA SEKALI ketika tampilan pertama kali dibuat dan MUNGKIN lebih sering terjadi ketika tampilan muncul kembali setelah disembunyikan. viewWillAppear akan SELALU dipanggil ketika tampilan akan muncul di layar.
DanM
2
Dapatkah seseorang tolong berkomentar lebih lanjut tentang dua pertanyaan terkait ini: (1) Terkadang, tidak selalu, nilai bingkai untuk kontrol (yaitu, asal dan ukuran) adalah nol di viewDidLoad, dan kadang-kadang tidak - Mengapa? (2) Dalam template Apple untuk detailView (iPad) splitViewController, ada metode configureView - apa yang harus ada di sana relatif terhadap viewDidLoad dan ViewWillAppear?
Jeff
12

Awalnya hanya ViewDidLoad dengan tableView. Pada pengujian dengan kehilangan Wifi, dengan mengatur perangkat ke mode pesawat, menyadari bahwa tabel tidak menyegarkan dengan kembalinya Wifi. Bahkan, tampaknya tidak ada cara untuk me-refresh tableView pada perangkat bahkan dengan menekan tombol home dengan mode latar belakang diatur ke YES di -Info.plist.

Solusi saya:

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

Penting untuk dicatat bahwa menggunakan viewDidLoad untuk penentuan posisi agak berisiko dan harus dihindari karena batasan tidak ditetapkan. ini dapat menyebabkan hasil yang tidak terduga (saya memiliki berbagai masalah ...)

Posting ini menjelaskan dengan sangat baik berbagai metode dan apa yang terjadi pada masing-masing metode tersebut.

saat ini untuk init dan posisi sekali pakai saya sedang berpikir untuk menggunakan viewDidAppear dengan sebuah flag, jika ada yang punya rekomendasi lain tolong beri tahu saya.

keisar
sumber
setuju dengan ini: "... harus dihindari karena batasannya tidak ditentukan ..."
danisupr4
4

Tergantung, Apakah Anda memerlukan data untuk dimuat setiap kali Anda membuka tampilan? atau hanya sekali ?

masukkan deskripsi gambar di sini

  • Merah: Mereka tidak perlu berubah setiap saat. Begitu mereka dimuat mereka tetap seperti apa adanya.
  • Ungu: Mereka perlu berubah seiring waktu atau setelah Anda memuat setiap waktu. Anda tidak ingin melihat 3 pengguna yang disarankan untuk diikuti, itu harus dimuat ulang setiap kali Anda kembali ke layar. Foto mereka mungkin diperbarui ... Anda tidak ingin melihat foto dari 5 tahun yang lalu ...

viewDidLoad:Pemrosesan apa pun yang Anda miliki perlu dilakukan sekali.
viewWilLAppear:Pemrosesan apa pun yang perlu diubah setiap kali halaman dimuat.

Label, ikon, judul tombol, atau sebagian besar data yang dimasukkan oleh Pengembang biasanya tidak berubah. Nama, foto, tautan, status tombol, daftar (masukan Array untuk tabel AndaDilihat atau koleksiLihat) atau sebagian besar data yang dimasukkan oleh Pengguna biasanya melakukan perubahan.

Madu
sumber
Ungu akan dipanggil di viewDidAppear bukan viewWillAppear
Alex Kornhauser
@ AlexKornhauser apa maksudmu itu akan dipanggil? Saya katakan di Anda, viewWillAppearAnda dapat meminta dan memeriksa tweet terbaru. viewDidAppearsudah terlambat untuk itu
Sayang