ViewController Lifecycle — adalah urutan metode yang UIKit panggil secara otomatis saat mengelola layar di iOS. Menurut Apple Documentation, setiap UIViewController melewati serangkaian status yang dapat diprediksi: dari pembuatan View hingga kemunculan dan penyembunyiannya. Memahami urutan dan tujuan metode ini adalah syarat penting untuk aplikasi iOS yang stabil.
Poin Utama
ViewController Lifecycle — adalah kumpulan metode yang diterima UIViewController dari UIKit selama keberadaannya. Setiap layar dalam aplikasi iOS secara berurutan melalui tahap pembuatan, pemuatan View, kemunculan di layar, penghilangan, dan pembebasan memori. UIKit secara otomatis memanggil metode yang sesuai pada setiap tahap, dan pengembang menimpanya dengan menambahkan logika sendiri.
Arsitektur UIViewController menjadi dasar UIKit dan tetap relevan bahkan di era SwiftUI — banyak proyek masih menggunakan pendekatan klasik atau arsitektur hibrida. Memahami Lifecycle memungkinkan Anda memprediksi kapan subviews tersedia, kapan layout dapat diubah dengan aman, dan operasi apa yang harus dilakukan saat layar muncul atau disembunyikan.
Setiap metode siklus hidup memiliki tujuan spesifik: beberapa dipanggil sekali selama keberadaan kontroler, yang lain — setiap kali muncul atau menghilang. Mencampur logika antar metode menyebabkan bug yang sulit ditemukan: kebocoran memori, pembaruan data yang salah, dan permintaan jaringan yang tidak perlu.
Enam metode membentuk siklus hidup lengkap UIViewController. Urutan pemanggilannya tetap dan tidak tergantung pada metode navigasi — push, present, atau unwind segue mengikuti jadwal yang sama.
loadView — metode pertama siklus, dipanggil ketika View kontroler belum ada. Jika Anda menggunakan Storyboard, UIKit secara otomatis memuat View dari file xib. Saat membuat antarmuka secara terprogram, Anda menimpa metode ini, menetapkan View akar secara manual. Di sebagian besar proyek, loadView tidak disentuh — pekerjaan dilakukan di viewDidLoad.
Menimpa loadView hanya diperlukan dalam kasus spesifik: ketika seluruh antarmuka dibuat dengan kode tanpa Storyboard atau ketika View akar harus dari kelas non-standar. Apple merekomendasikan untuk tidak memanggil super.loadView saat menimpa — Anda sepenuhnya mengambil alih pembuatan View.
override func loadView() {
view = UIView()
view.backgroundColor = .white
}
viewDidLoad — metode yang paling sering digunakan dalam siklus. Dipanggil sekali setelah View dimuat ke memori, tetapi belum ditampilkan di layar. Di sini subviews dikonfigurasi, tabel diisi dengan data, sel didaftarkan, dan notifikasi yang berlaku selama masa hidup kontroler dilanggani.
Fitur penting: viewDidLoad tidak dipanggil ulang saat layar ditampilkan kembali. Jika Anda perlu memperbarui data setiap kali muncul — gunakan viewWillAppear. Di viewDidLoad, tempatkan hanya operasi satu kali yang menjadi dasar konfigurasi.
viewWillAppear dipanggil setiap kali tepat sebelum View menjadi terlihat oleh pengguna. Metode ini menerima parameter animated, yang menunjukkan apakah kemunculan disertai animasi. Di sini data diperbarui, tabel dimuat ulang, NavigationBar dikonfigurasi, dan elemen disembunyikan atau ditampilkan tergantung status aplikasi.
Gunakan viewWillAppear untuk sinkronisasi status antar layar: jika pengguna mungkin telah mengubah data di layar sebelumnya, metode ini adalah tempat yang tepat untuk memperbarui antarmuka. Setiap pemanggilan viewWillAppear mendahului kemunculan layar, bahkan saat kembali dari kontroler anak.
viewDidAppear memberi tahu bahwa View telah sepenuhnya muncul di layar dan semua animasi transisi selesai. Pada saat ini, layar siap untuk interaksi — pengguna melihat antarmuka lengkap dan dapat bekerja dengannya. Metode ini cocok untuk memulai animasi yang harus dimulai setelah kemunculan, memulai timer, dan melacak tampilan analitik.
Tidak seperti viewWillAppear, viewDidAppear menjamin bahwa layar tidak hanya terlihat tetapi juga sepenuhnya dirender. Jika Anda memulai animasi di viewWillAppear, beberapa frame mungkin terlewat karena UIKit belum menyelesaikan transisi. Untuk animasi yang halus, gunakan viewDidAppear.
viewWillDisappear dipanggil sebelum View menghilang dari layar — saat beralih ke kontroler lain, menutup jendela modal, atau meminimalkan aplikasi. Ini adalah tempat yang tepat untuk menyimpan status, berhenti berlangganan notifikasi, menghentikan proses aktif, dan membebaskan sumber daya yang tidak diperlukan saat layar tidak terlihat.
Penting untuk diingat: viewWillDisappear tidak menjamin bahwa View akan benar-benar menghilang — gerakan dapat dibatalkan. Oleh karena itu, simpan data kritis juga di viewDidDisappear, yang dipanggil hanya setelah penghilangan sebenarnya.
viewDidDisappear mengakhiri siklus kemunculan dan penghilangan. Dipanggil setelah View telah disembunyikan dari layar. Dalam metode ini, animasi dihentikan sepenuhnya, objek sementara dihapus, dan penyimpanan data yang dimulai di viewWillDisappear dikonfirmasi.
Metode ini juga mendahului deinit kontroler — jika UIViewController Anda dihancurkan, viewDidDisappear akan menjadi metode Lifecycle terakhir sebelum pemanggilan deinit. Gunakan untuk pembersihan akhir yang harus terjadi sebelum objek dihancurkan.
Urutan pemanggilan tergantung pada bagaimana layar muncul: pertama kali, saat kembali, atau saat tampilan modal. Mari kita lihat tiga skenario utama dari perspektif UIKit.
Pada kemunculan pertama layar, UIKit melalui siklus pembuatan lengkap: loadView dipanggil, kemudian viewDidLoad, setelah itu animasi kemunculan dimulai. Selama animasi, viewWillAppear dipanggil, dan setelah selesai — viewDidAppear. Ini adalah satu-satunya skenario di mana semua metode dari loadView hingga viewDidAppear dipanggil secara berurutan.
override func viewDidLoad() {
super.viewDidLoad()
print("viewDidLoad — View dimuat ke memori")
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print("viewWillAppear — akan segera muncul")
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("viewDidAppear — layar sepenuhnya terlihat")
}
Ketika pengguna kembali ke layar sebelumnya, UIKit tidak memanggil ulang viewDidLoad — View sudah dimuat ke memori. Sebaliknya, di layar yang kembali hanya viewWillAppear dan viewDidAppear yang dipicu, dan di layar saat ini — viewWillDisappear dan viewDidDisappear. loadView dan viewDidLoad dilewati karena layar sudah ada di tumpukan navigasi.
Tampilan modal mengikuti aturan yang sama: pada kontroler baru, siklus lengkap dipanggil saat kemunculan pertama, dan pada kontroler saat ini — viewWillDisappear dan viewDidDisappear. Saat dismiss, urutannya terbalik: pada kontroler yang kembali, viewWillAppear dan viewDidAppear dipicu lagi, dan pada kontroler yang disembunyikan — metode akhir. Perilaku ini seragam untuk semua jenis transisi di UIKit.
Mari kita lihat empat skenario utama di mana pemahaman Lifecycle secara langsung memengaruhi kualitas kode dan pengalaman pengguna. Untuk setiap skenario, kami memberikan contoh dengan rekomendasi.
viewDidLoad — tempat untuk konfigurasi awal yang tidak tergantung pada visibilitas layar. Di sini collectionView dikonfigurasi, file nib untuk sel didaftarkan, data source dan layout dibuat. Jika Anda memuat data dari jaringan, di viewDidLoad sebaiknya hanya memulai permintaan, dan memperbarui antarmuka di viewWillAppear saat layar siap ditampilkan.
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(
MyCell.self,
forCellReuseIdentifier: MyCell.identifier
)
viewModel.loadInitialData()
}
Gunakan viewWillAppear untuk menyinkronkan data setiap kali layar muncul. Misalnya, jika pengguna mungkin telah mengubah pengaturan di layar sebelumnya, di sini nilai yang ditampilkan diperbarui, tabel dimuat ulang, dan status NavigationBar diperbaiki. Ini memastikan bahwa layar selalu menampilkan data terkini dalam skenario navigasi apa pun.
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tableView.reloadData()
navigationController?.setNavigationBarHidden(false, animated: animated)
}
viewDidAppear sangat ideal untuk memulai animasi yang harus dimulai setelah pengguna melihat layar. Di sini juga peristiwa analitik dikirim: tampilan layar, mulai onboarding, atau mulai pemutaran video. Memulai animasi sebelum transisi selesai menghasilkan antarmuka yang tersendat — UIKit tidak sempat menyiapkan frame yang cukup.
Di viewWillDisappear, draf disimpan, timer dihentikan, dan langganan NotificationCenter dibatalkan. Ini adalah momen terakhir saat layar masih terlihat dan tersedia untuk operasi yang memerlukan konteks pengguna. Untuk data kritis, tambahan viewDidDisappear digunakan sebagai perlindungan terhadap gerakan yang dibatalkan.
Penggunaan yang salah dari metode siklus hidup adalah salah satu sumber bug paling umum di aplikasi iOS. Mari kita lihat kesalahan utama yang dilakukan pengembang pada berbagai tahap bekerja dengan UIViewController.
Kesalahan pertama — membuat subviews di init atau loadView saat menggunakan Storyboard. Jika Anda menggunakan Interface Builder, jangan timpa loadView tanpa perlu. Membuat View di loadView dengan storyboard yang ada menyebabkan file xib diabaikan dan layar kosong.
Kesalahan kedua — berlangganan notifikasi keyboard di viewDidLoad tanpa berhenti berlangganan. Jika Anda berlangganan UIResponder.keyboardWillShowNotification tetapi tidak berhenti berlangganan saat layar disembunyikan, blok akan dipanggil bahkan setelah deinit kontroler — ini adalah kebocoran memori dengan potensi crash aplikasi.
Kesalahan ketiga — timer dan permintaan jaringan yang dimulai sebelum layar muncul. Memuat gambar atau menjalankan animasi ketika View belum terlihat — pemborosan sumber daya. Pindahkan pembaruan visual ke viewWillAppear atau viewDidAppear.
Kesalahan keempat — menyimpan data hanya di viewWillDisappear. Pada gerakan pop interaktif, pengguna dapat memulai gesekan dan membatalkannya — metode dipanggil, tetapi layar tidak menghilang. Duplikasi penyimpanan kritis di viewDidDisappear atau di handler applicationDidEnterBackground.
Pertanyaan yang Sering Diajukan
Sekali — setelah View dimuat ke memori. Saat layar muncul kembali, viewDidLoad tidak dipanggil. Jika perlu membuat ulang View, kontroler harus dihancurkan dan dibuat ulang.
UIKit memerlukan pemanggilan super.viewDidLoad untuk berfungsinya siklus hidup dengan benar. Tanpanya, masalah dengan pembaruan layout dan pemrosesan transisi dapat terjadi. Selalu panggil super sebagai perintah pertama dalam metode.
Tidak disarankan. Jika kontroler diinisialisasi dari Storyboard, UIKit secara otomatis memuat View dari xib. Menimpa loadView membatalkan proses ini dan storyboard Anda akan diabaikan.
Berlanggananlah di viewDidLoad atau viewWillAppear, dan berhenti berlangganan di viewWillDisappear atau viewDidDisappear, menggunakan referensi lemah ke self untuk menghindari kebocoran memori di closure.
Force quit mematikan proses secara paksa — UIKit tidak sempat memanggil metode Lifecycle. Untuk menyimpan data, gunakan notifikasi UIApplication.willTerminateNotification di AppDelegate.
Ringkasan
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