viewDidLoad — adalah metode pertama yang dipanggil UIKit setelah View dari UIViewController dimuat ke memori. Menurut Apple Developer Documentation, metode ini dipanggil tepat satu kali selama masa hidup controller. viewDidLoad adalah tempat utama untuk pengaturan awal antarmuka, pendaftaran sel, dan inisialisasi data.
Poin Utama
viewDidLoad — adalah metode instance dari UIViewController yang dipanggil UIKit segera setelah View controller dimuat ke dalam RAM. Pada saat ini, semua properti IBOutlet sudah terhubung dengan elemen antarmuka, tetapi View belum ditambahkan ke hierarki jendela dan tidak terlihat oleh pengguna. Pengembang menimpa metode ini untuk melakukan konfigurasi awal layar.
Metode ini adalah bagian dari ViewController Lifecycle dan mengikuti segera setelah loadView, jika View dibuat secara terprogram, atau setelah dimuat dari Storyboard. Dalam proyek tipikal, viewDidLoad adalah metode UIViewController yang paling sering ditimpa, karena menyediakan titik aman untuk bekerja dengan subviews yang sudah ada dan siap dikonfigurasi.
Detail penting: pada saat viewDidLoad dipanggil, ukuran View belum sesuai dengan ukuran akhir — Auto Layout belum menyelesaikan lintasannya, dan frame mungkin berbeda dari yang diharapkan. Untuk perhitungan yang bergantung pada ukuran, gunakan viewDidLayoutSubviews.
Waktu pemanggilan viewDidLoad tergantung pada bagaimana controller diinisialisasi. Dalam kebanyakan kasus, UIKit secara otomatis memanggil metode ini pada akses pertama ke properti view controller — ini disebut mekanisme lazy-loading UIViewController.
Ketika NavigationController atau TabBarController pertama kali menampilkan layar Anda, UIKit memeriksa apakah View sudah dimuat. Jika belum — loadView (atau pemuatan dari Storyboard) dipanggil, setelah itu segera viewDidLoad dijalankan. Ini adalah skenario standar dan terjadi satu kali untuk setiap instance controller.
override func viewDidLoad() {
super.viewDidLoad()
print("View dimuat — antarmuka dapat dikonfigurasi")
setupUI()
configureTableView()
}
viewDidLoad tidak dipanggil ulang saat kembali ke layar melalui back button atau dismiss. Jika logika Anda tergantung pada layar yang muncul kembali — tempatkan di viewWillAppear. Ini adalah salah satu kesalahan konseptual paling umum: pengembang mengharapkan viewDidLoad aktif setiap kali ditampilkan, tetapi UIKit hanya memanggilnya satu kali.
Terkadang pengembang memaksa pemanggilan view controller untuk memulai pemuatan lebih awal: let _ = controller.view. Ini memaksa pemanggilan loadView dan viewDidLoad sebelum controller muncul di layar. Trik ini digunakan ketika View perlu disiapkan sebelumnya untuk transisi yang mulus.
viewDidLoad dirancang untuk operasi konfigurasi satu kali yang tidak tergantung pada apakah layar terlihat. Penggunaan yang benar dari metode ini adalah kunci arsitektur yang bersih dan perilaku controller yang dapat diprediksi.
Di viewDidLoad, file nib dan kelas didaftarkan untuk UITableView dan UICollectionView, delegasi dikonfigurasi, dan nilai awal properti elemen UI ditetapkan. Karena semua IBOutlet sudah terhubung saat ini, label.text, imageView.image, dan properti subviews lainnya dapat diakses dengan aman.
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
tableView.register(
CustomCell.self,
forCellReuseIdentifier: CustomCell.identifier
)
title = "Layar utama"
}
Di sini viewModel dibuat, data source diinisialisasi dengan array, dan notifikasi yang harus berfungsi sepanjang masa hidup controller dilanggan. Misalnya, berlangganan UIApplication.willEnterForegroundNotification untuk memperbarui data saat kembali dari latar belakang — kandidat yang tepat untuk viewDidLoad. ViewModel dalam arsitektur iOS modern berperan sebagai penghubung antara controller dan logika bisnis, dan inisialisasinya tepat di viewDidLoad memastikan kesiapan data pada saat layar pertama kali muncul.
Berikan perhatian khusus pada konfigurasi data source untuk tabel dan koleksi. Jika tabel Anda menggunakan UIFetchedResultsController atau NSFetchedResultsController dengan Core Data, inisialisasi fetch request dan delegasi di viewDidLoad. Ini menjamin bahwa pada saat layar pertama kali muncul, tabel sudah terisi data tanpa kueri tambahan.
Di viewDidLoad, tombol NavigationBar dikonfigurasi, large title diatur, search controller ditambahkan, dan tombol edit/done diatur. Elemen-elemen ini jarang berubah saat layar ditampilkan ulang, jadi inisialisasinya di sini optimal.
Tidak semua operasi cocok di viewDidLoad. Beberapa tindakan yang ditempatkan di metode ini menyebabkan konsumsi memori berlebihan, perilaku yang salah, atau bug saat layar ditampilkan ulang.
Hindari menjalankan permintaan jaringan yang hasilnya hanya mempengaruhi UI. Jika permintaan selesai sebelum layar muncul, pengguna tidak akan melihat hasilnya, dan jika setelahnya — data mungkin sudah usang. Mulai pemuatan di viewDidLoad, tetapi perbarui UI di viewWillAppear.
Jangan lakukan operasi yang tergantung pada ukuran dan posisi View di viewDidLoad. Pada saat pemanggilan, Auto Layout belum menyelesaikan lintasannya, dan frame mungkin belum final. Untuk perhitungan, gunakan viewDidLayoutSubviews atau timpa updateViewConstraints.
Jangan berlangganan notifikasi yang hanya aktif saat layar terlihat. Notifikasi keyboard, notifikasi perubahan konten controller anak — langganilah di viewWillAppear dan berhenti berlangganan di viewDidDisappear untuk menghindari panggilan yang tidak perlu dan kebocoran memori.
Jangan panggil metode yang memerlukan layar terlihat. Misalnya, mencoba menampilkan UIAlertController dari viewDidLoad akan menyebabkan kesalahan karena View controller belum ditambahkan ke hierarki jendela. Semua operasi UI yang tergantung pada window atau presentedViewController hanya boleh dilakukan setelah layar muncul.
Jangan inisialisasi sumber daya berat tanpa kebutuhan. Jika layar jarang dibuka atau data tidak segera ditampilkan, tunda pembuatan objek yang memakan sumber daya sampai benar-benar diperlukan. Inisialisasi lazy properti di Swift adalah mekanisme bawaan untuk menyelesaikan tugas ini: properti dengan pengubah lazy hanya akan dibuat saat pertama kali diakses, yang menghemat memori dan mempercepat pemuatan layar.
Jangan gunakan viewDidLoad untuk operasi yang harus dijalankan setiap kali layar muncul. Ini adalah kesalahan paling mendasar: pengembang pemula sering menempatkan logika pembaruan data di viewDidLoad dan heran ketika tabel tidak dimuat ulang saat kembali dari layar lain. Jika operasi harus diulang setiap kali ditampilkan — gunakan viewWillAppear. Jika harus dijalankan sekali selama masa hidup — viewDidLoad. Ingat aturan sederhana ini untuk menghindari sebagian besar masalah dengan siklus hidup UIViewController.
Mari kita lihat tiga contoh praktis yang menunjukkan penggunaan viewDidLoad yang benar dalam proyek nyata. Setiap contoh menyelesaikan tugas konfigurasi layar tertentu.
override func viewDidLoad() {
super.viewDidLoad()
collectionView.register(
PhotoCell.self,
forCellWithReuseIdentifier: PhotoCell.reuseId
)
collectionView.register(
HeaderView.self,
forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader,
withReuseIdentifier: HeaderView.reuseId
)
viewModel.delegate = self
viewModel.fetchInitialPage()
}
override func viewDidLoad() {
super.viewDidLoad()
let label = UILabel()
label.text = "Halo, dunia!"
label.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(label)
NSLayoutConstraint.activate([
label.centerXAnchor.constraint(equalTo: view.centerXAnchor),
label.centerYAnchor.constraint(equalTo: view.centerYAnchor)
])
}
Di viewDidLoad juga dikonfigurasi elemen yang ditampilkan saat tidak ada data: keadaan kosong, loader, placeholder. Komponen ini dibuat sekali dan digunakan kembali setiap kali layar muncul. Menyembunyikan atau menampilkan elemen-elemen ini dikendalikan di viewWillAppear tergantung pada data terkini.
override func viewDidLoad() {
super.viewDidLoad()
emptyStateLabel = UILabel()
emptyStateLabel.text = "Tidak ada data"
emptyStateLabel.textAlignment = .center
emptyStateLabel.isHidden = true
view.addSubview(emptyStateLabel)
activityIndicator = UIActivityIndicatorView(style: .medium)
activityIndicator.hidesWhenStopped = true
view.addSubview(activityIndicator)
}
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(
self,
selector: #selector(handleEnterForeground),
name: UIApplication.willEnterForegroundNotification,
object: nil
)
}
@objc private func handleEnterForeground() {
refreshContent()
}
Pertanyaan yang Sering Diajukan
Dalam kondisi normal tidak — UIKit memanggil viewDidLoad satu kali setelah View dimuat ke memori. Jika controller dihancurkan dan dibuat ulang, viewDidLoad akan berjalan untuk instance baru.
Ya, wajib. Memanggil super.viewDidLoad menjamin bahwa UIKit melakukan konfigurasi internal yang diperlukan untuk berfungsinya Lifecycle dengan benar. Selalu panggil super sebagai hal pertama di dalam metode.
viewDidLoad dipanggil satu kali saat View dimuat. viewWillAppear dipanggil setiap kali sebelum layar muncul. Yang pertama — untuk konfigurasi satu kali, yang kedua — untuk memperbarui data dan status.
Operasi berat sinkron di viewDidLoad memblokir main thread dan menunda kemunculan layar. Pemuatan asinkron diperbolehkan, tetapi saat memperbarui UI setelah selesai, perlu dipertimbangkan bahwa layar mungkin sudah tersembunyi.
Secara langsung viewDidLoad tidak bisa dipanggil — UIKit yang memanggilnya. Untuk memaksa pemuatan View, akses properti controller.view. Ini akan memicu loadView dan viewDidLoad secara otomatis.
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