viewWillDisappear adalah metode UIViewController yang dipanggil UIKit tepat sebelum layar mulai menghilang dari tampilan pengguna. Menurut Apple Developer Documentation, metode ini menerima parameter animated dan dipicu saat push, pop, present, dismiss, dan perpindahan tab. viewWillDisappear adalah tempat utama untuk menyimpan status dan membersihkan sumber daya dengan benar.
Poin Utama
viewWillDisappear adalah metode UIViewController yang dipanggil UIKit tepat sebelum View controller mulai menghilang dari layar. Pada saat ini, layar masih terlihat oleh pengguna, tetapi transisi sudah dimulai: NavigationController telah memulai animasi push/pop, jendela modal mulai menutup, atau TabBar mulai beralih ke tab lain. Pengembang menimpa metode ini untuk melakukan operasi yang memerlukan layar masih tersedia, tetapi sudah bersiap untuk disembunyikan.
Tidak seperti viewDidDisappear yang dipicu setelah layar disembunyikan, viewWillDisappear memberikan kesempatan terakhir untuk menyimpan data dan membebaskan sumber daya saat pengguna masih melihat antarmuka. Ini sangat penting untuk UX — menyimpan draf atau menghentikan timer harus terjadi sebelum pengguna beralih ke layar lain.
Metode ini menerima parameter animated, yang menunjukkan apakah penghilangan terjadi dengan animasi. Nilai true berarti UIKit melakukan transisi dengan animasi, false — layar menghilang seketika, misalnya saat dismiss tanpa animasi atau penghapusan terprogram dari hierarki.
viewWillDisappear dipanggil dalam semua skenario ketika layar saat ini berhenti aktif. Mari kita bahas kasus utama yang spesifik untuk pengembangan iOS.
Ketika UINavigationController melakukan push controller baru, pada controller saat ini viewWillDisappear dipanggil di awal animasi transisi. Pada saat ini, layar saat ini masih terlihat di bawah controller baru yang meluncur di atasnya. Ini adalah skenario standar di mana viewWillDisappear dipicu dengan animated = true.
Ketika pengguna menekan tombol kembali atau melakukan geseran interaktif ke belakang, pada controller saat ini viewWillDisappear dipanggil. Pada gerakan interaktif, panggilan ini dapat dibatalkan jika pengguna berubah pikiran dan mengembalikan layar ke tempatnya. Ini adalah fitur penting yang perlu dipertimbangkan saat merancang penyimpanan status.
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
saveDraftData()
NotificationCenter.default.removeObserver(self)
}
Saat menutup jendela modal, viewWillDisappear dipanggil pada controller yang ditutup di awal animasi dismiss. Pada saat ini, hasil dapat dikirim kembali melalui delegate atau closure, karena controller yang menampilkan jendela modal belum menerima kendali.
UITabBarController memanggil viewWillDisappear pada controller tab yang ditinggalkan segera setelah pengguna menyentuh tab lain. Jika pada tab saat ini ada proses aktif — pemutaran media, pengunduhan file, timer — di sini proses tersebut dijeda atau dihentikan.
viewWillDisappear menyelesaikan tugas-tugas konkret dalam mengelola sumber daya dan status. Mari kita bahas skenario utama dengan contoh kode.
Tugas terpenting viewWillDisappear — menyimpan data yang dimasukkan atau diubah pengguna di layar saat ini. Draf pesan, bidang formulir yang diedit, pengaturan yang dipilih — semua ini harus disimpan sebelum layar menghilang. Gunakan Core Data, UserDefaults, atau penyimpanan file untuk persistensi.
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
guard hasUnsavedChanges else { return }
draftStorage.save(currentDraft)
}
NotificationCenter, KVO, dan publisher Combine yang Anda langgani di viewWillAppear atau viewDidLoad harus dibatalkan di viewWillDisappear. Jika tidak, notifikasi akan sampai ke layar tersembunyi, menyebabkan pembaruan UI yang tidak dilihat pengguna, atau lebih buruk — crash karena referensi ke objek yang sudah dibebaskan.
Animasi UIView yang dimulai di viewDidAppear dan timer yang bekerja melalui Timer atau DispatchSource harus dihentikan di viewWillDisappear. Animasi yang berlanjut di layar tersembunyi menghabiskan GPU dan baterai tanpa manfaat bagi pengguna. Hentikan secara eksplisit dengan memanggil invalidate pada timer dan removeAllAnimations pada layer.
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
countdownTimer?.invalidate()
countdownTimer = nil
loadingIndicator.layer.removeAllAnimations()
}
Jika controller dibuka untuk mendapatkan hasil — pemilihan elemen, masukan teks, konfirmasi tindakan — viewWillDisappear adalah momen terakhir ketika controller asli masih ada di tumpukan dan dapat menerima data. Panggil delegate atau closure sebelum deinit dipanggil.
Penyimpanan andal status layar adalah salah satu tugas tersulit dalam pengembangan iOS. viewWillDisappear adalah elemen penting, tetapi bukan satu-satunya elemen strategi. Mari kita bahas pendekatan komprehensif.
Tingkat 1 — penyimpanan di viewWillDisappear. Penyimpanan cepat data ringan yang harus tersedia segera setelah kembali. Cocok untuk status UI: posisi gulir, segmen yang dipilih, teks di bidang masukan. Masalah: pada gerakan pop interaktif yang dibatalkan, penyimpanan terjadi meskipun pengguna tetap di layar — data ditimpa tanpa perlu.
Tingkat 2 — penyimpanan di viewDidDisappear. Menduplikasi penyimpanan dari tingkat pertama, tetapi hanya dipicu setelah layar dijamin disembunyikan. Ini adalah asuransi terhadap gerakan yang dibatalkan. Namun, jika di viewWillDisappear Anda sudah berhenti berlangganan notifikasi, viewDidDisappear mungkin tidak memiliki akses ke beberapa data.
Tingkat 3 — penyimpanan melalui notifikasi aplikasi. UIApplication.willResignActiveNotification dan UIApplication.didEnterBackgroundNotification mencegat pengecilan aplikasi. Jika pengguna mengecilkan aplikasi, viewWillDisappear mungkin tidak dipanggil — tetapi penyimpanan melalui notifikasi ini menjamin integritas data saat sesi berakhir.
| Tingkat | Metode/Notifikasi | Keandalan | Penggunaan |
|---|---|---|---|
| 1 | viewWillDisappear | Tinggi | Status UI, draf |
| 2 | viewDidDisappear | Sangat tinggi | Data kritis |
| 3 | willResignActive | Maksimal | Saat mengecilkan |
Rekomendasi: gunakan kombinasi ketiga tingkat untuk data pengguna yang kritis. Untuk status tidak kritis — tingkat pertama sudah cukup. Penting untuk tidak menimpa data yang sama berulang kali — gunakan flag dirty yang menunjukkan bahwa data telah berubah sejak penyimpanan terakhir.
Perhatian khusus harus diberikan pada strategi untuk layar CRUD, di mana pengguna memasukkan data. Pada layar seperti itu, menyimpan setiap penekanan tombol di viewWillDisappear tidak disarankan — ini berlebihan. Gunakan penyimpanan otomatis dengan penundaan (debounce) melalui Timer, dan terapkan viewWillDisappear hanya untuk penyimpanan paksa akhir jika ada perubahan yang belum disimpan. Pendekatan semacam itu menyeimbangkan antara kinerja dan keamanan data.
Untuk aplikasi dengan Core Data, langkah tambahan adalah memanggil saveContext di viewWillDisappear hanya ketika ada perubahan nyata di managed object context. Pengecekan context.hasChanges sebelum penyimpanan mencegah penulisan yang tidak perlu ke persistent store dan memperpanjang masa pakai baterai perangkat. Gabungkan pemeriksaan ini dengan penyimpanan global di applicationDidEnterBackground.
Penggunaan yang salah dari viewWillDisappear dapat menyebabkan kehilangan data, kebocoran memori, dan perilaku aplikasi yang tidak stabil. Mari kita bahas kesalahan umum pengembang iOS.
Kesalahan pertama — menyimpan data hanya di viewWillDisappear. Seperti dibahas di atas, pada gerakan pop interaktif metode dipanggil meskipun layar tidak menghilang. Jika penyimpanan memiliki efek samping — mengirim data ke server, mengubah status — ini dapat menyebabkan pemicuan palsu. Tambahkan pemeriksaan isBeingDismissed atau isMovingFromParent.
Kesalahan kedua — tidak berhenti berlangganan dari NotificationCenter. Ini adalah salah satu kebocoran memori paling umum di iOS. Jika Anda berlangganan di viewWillAppear ke UIResponder.keyboardWillShowNotification tetapi tidak berhenti berlangganan di viewWillDisappear, closure terus dipanggil. Saat deinit controller, closure akan merujuk ke objek yang telah dibebaskan — crash aplikasi dijamin.
Kesalahan ketiga — melakukan operasi sinkron yang berat. Menyimpan data dalam jumlah besar, menulis ke Core Data atau sistem file di viewWillDisappear memblokir main thread. Jika operasi berlangsung lebih lama dari animasi transisi, UIKit menghentikan thread dan antarmuka membeku. Pindahkan penyimpanan berat ke antrian latar belakang.
Kesalahan keempat — lupa memanggil super. Tidak memanggil super.viewWillDisappear dapat mengganggu kerja UINavigationController dan UITabBarController, yang menggunakan metode ini untuk status internalnya. Selalu panggil super pertama atau terakhir, sesuai dengan dokumentasi Apple.
Masalah ini diperparah di iOS dengan multitasking aktif dan perpindahan antar aplikasi. Kesalahan kelima — menggunakan DispatchQueue.main.async setelah penyimpanan di viewWillDisappear. Jika Anda secara asinkron mengirim blok ke antrian utama setelah memanggil super.viewWillDisappear, tidak ada jaminan bahwa controller masih ada saat blok dieksekusi. Selalu gunakan referensi lemah [weak self] di dalam closure untuk mencegah referensi ke memori yang dibebaskan dan mencegah crash aplikasi.
Pertanyaan yang Sering Diajukan
viewWillDisappear dipanggil di awal penghilangan, saat layar masih terlihat. viewDidDisappear — setelah layar sepenuhnya tersembunyi dan animasi selesai.
Gunakan viewDidDisappear untuk konfirmasi penyimpanan atau periksa properti isMovingFromParent dan isBeingDismissed di dalam viewWillDisappear untuk menentukan apakah layar benar-benar akan menghilang.
Ya, wajib, jika Anda menggunakan blok atau selektor dengan self. ARC tidak mengelola langganan NotificationCenter. Di iOS 9+ untuk blok gunakan referensi lemah dan berhenti berlangganan di viewWillDisappear.
Tidak bisa — force quit tidak memanggil metode Lifecycle. Untuk penyimpanan terjamin saat aplikasi berakhir, gunakan UIApplication.willTerminateNotification atau simpan data secara real-time saat berubah.
Ya, pada gerakan pop interaktif, UIKit memanggil viewWillDisappear segera setelah gerakan dimulai. Jika pengguna membatalkan gerakan, layar tetap terlihat, tetapi metode sudah dipicu. Selalu periksa isMovingFromParent.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga