viewDidLoad, UIKit'in UIViewController'ın View'ini belleğe yükledikten sonra çağırdığı ilk yöntemdir. Apple Developer Documentation'a göre, bu yöntem denetleyicinin tüm ömrü boyunca tam olarak bir kez çağrılır. viewDidLoad, arayüzün ilk kurulumu, hücre kaydı ve veri başlatma için ana yerdir.
Anahtar Noktalar
viewDidLoad, UIKit'in denetleyicinin View'i belleğe yüklendikten hemen sonra çağırdığı bir UIViewController örnek yöntemidir. Bu noktada, tüm IBOutlet özellikleri zaten arayüz öğelerine bağlanmıştır, ancak View henüz pencere hiyerarşisine eklenmemiştir ve kullanıcı tarafından görünmez. Geliştirici, ilk ekran yapılandırmasını gerçekleştirmek için bu yöntemi geçersiz kılar.
Yöntem, ViewController Lifecycle'ın bir parçasıdır ve View programatik olarak oluşturulduysa loadView'dan hemen sonra veya Storyboard'dan yüklemeden sonra gelir. Tipik bir projede viewDidLoad, UIViewController'ın en sık geçersiz kılınan yöntemidir, çünkü zaten var olan ve yapılandırmaya hazır olan alt görünümlerle (subview) çalışmak için güvenli bir nokta sağlar.
Önemli bir detay: viewDidLoad çağrıldığı sırada View'ın boyutları henüz nihai boyutlara karşılık gelmez — Auto Layout geçişlerini tamamlamamıştır ve çerçeve (frame) beklenenden farklı olabilir. Boyutlara bağlı hesaplamalar için viewDidLayoutSubviews kullanın.
viewDidLoad çağrısının zamanlaması, denetleyicinin nasıl başlatıldığına bağlıdır. Çoğu durumda UIKit, denetleyicinin view özelliğine ilk kez erişildiğinde bu yöntemi otomatik olarak çağırır — buna UIViewController'ın tembel yükleme (lazy-loading) mekanizması denir.
Bir NavigationController veya TabBarController ekranınızı ilk kez gösterdiğinde, UIKit View'un yüklenip yüklenmediğini kontrol eder. Yüklenmemişse — loadView çağrılır (veya Storyboard'dan yükleme), ardından hemen viewDidLoad tetiklenir. Bu standart senaryodur ve her denetleyici örneği için bir kez gerçekleşir.
override func viewDidLoad() {
super.viewDidLoad()
print("View yüklendi — arayüzü yapılandırabilirsiniz")
setupUI()
configureTableView()
}
Geri düğmesi veya dismiss aracılığıyla ekrana geri dönüldüğünde viewDidLoad yeniden çağrılmaz. Mantığınız ekranın tekrar görünmesine bağlıysa — viewWillAppear içine koyun. Bu en yaygın kavramsal hatalardan biridir: geliştiriciler viewDidLoad'ın her görüntülemede çalışmasını bekler, ancak UIKit onu yalnızca bir kez çağırır.
Bazen geliştiriciler, yüklemeyi önceden tetiklemek için denetleyicinin view'ine zorla erişir: let _ = controller.view. Bu, denetleyici ekranda görünmeden önce loadView ve viewDidLoad'ın çağrılmasını zorlar. Bu teknik, yumuşak bir geçiş için View'ı önceden hazırlamanız gerektiğinde kullanılır.
viewDidLoad, ekranın görünür olup olmadığına bağlı olmayan tek seferlik kurulum işlemleri için tasarlanmıştır. Bu yöntemin doğru kullanımı, temiz mimarinin ve öngörülebilir denetleyici davranışının anahtarıdır.
viewDidLoad'da UITableView ve UICollectionView için nib dosyaları ve sınıflar kaydedilir, delegate'ler yapılandırılır ve UI öğelerinin özelliklerinin başlangıç değerleri ayarlanır. Bu noktada tüm IBOutlet'ler zaten bağlı olduğundan, label.text, imageView.image ve diğer alt görünüm özelliklerine güvenle erişilebilir.
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
tableView.register(
CustomCell.self,
forCellReuseIdentifier: CustomCell.identifier
)
title = "Ana ekran"
}
Burada bir viewModel oluşturulur, data source dizilerle başlatılır ve denetleyicinin tüm ömrü boyunca aktif olması gereken bildirimlere abone olunur. Örneğin, arka plandan dönüşte verileri güncellemek için UIApplication.willEnterForegroundNotification aboneliği viewDidLoad için iyi bir adaydır. Modern iOS mimarisinde viewModel, denetleyici ve iş mantığı arasında bir köprü görevi görür ve viewDidLoad'da başlatılması, ekran ilk göründüğünde verilerin hazır olmasını sağlar.
Tablolar ve koleksiyonlar için data source yapılandırmasına özellikle dikkat edin. Tablonuz Core Data ile UIFetchedResultsController veya NSFetchedResultsController kullanıyorsa, viewDidLoad'da fetch request ve delegate'i başlatın. Bu, ekran ilk göründüğünde tablonun ek istek olmadan zaten verilerle dolu olmasını sağlar.
viewDidLoad'da NavigationBar düğmeleri yapılandırılır, large title ayarlanır, search controller eklenir ve edit/done düğmeleri ayarlanır. Bu öğeler ekran tekrar gösterildiğinde nadiren değişir, bu nedenle burada başlatılmaları optimaldir.
Tüm işlemler viewDidLoad için uygun değildir. Bu yönteme konulan bazı eylemler aşırı bellek tüketimine, yanlış davranışa veya ekran tekrar gösterildiğinde hatalara yol açar.
Kaçının sonucu yalnızca UI'ı etkileyen ağ istekleri başlatmaktan. İstek ekran görünmeden önce tamamlanırsa, kullanıcı sonucu görmez ve sonra tamamlanırsa — veriler güncelliğini yitirmiş olabilir. Yüklemeyi viewDidLoad'da başlatın, ancak UI'ı viewWillAppear'da güncelleyin.
Yapmayın viewDidLoad'da View'ın boyutuna ve konumuna bağlı işlemler. Çağrı anında Auto Layout geçişlerini tamamlamamıştır ve çerçeve nihai olmayabilir. Hesaplamalar için viewDidLayoutSubviews kullanın veya updateViewConstraints'ı geçersiz kılın.
Abone olmayın yalnızca ekran görünürken ilgili olan bildirimlere. Klavye bildirimleri, alt denetleyicilerden içerik değişikliği bildirimleri — viewWillAppear'da abone olun ve gereksiz çağrıları ve sızıntıları önlemek için viewDidDisappear'da abonelikten çıkın.
Çağırmayın görünür bir ekran gerektiren yöntemleri. Örneğin, viewDidLoad'dan bir UIAlertController göstermeye çalışmak, denetleyicinin View'i henüz pencere hiyerarşisine eklenmediği için hataya neden olur. Pencereye veya presentedViewController'a bağlı herhangi bir UI işlemi, yalnızca ekran göründükten sonra yapılmalıdır.
Başlatmayın gereksiz yere ağır kaynakları. Ekran nadiren gösteriliyorsa veya veriler hemen görüntülenmiyorsa, kaynak yoğun nesnelerin oluşturulmasını gerçekten ihtiyaç duyulana kadar erteleyin. Swift'te tembel (lazy) özellik başlatma, bu sorunu çözmek için yerleşik bir mekanizmadır: lazy değiştiricili bir özellik yalnızca ilk erişimde oluşturulur, belleği korur ve ekran yüklemesini hızlandırır.
Kullanmayın viewDidLoad'ı her ekran göründüğünde yapılması gereken işlemler için. Bu en temel hatadır: acemi geliştiriciler genellikle veri güncelleme mantığını viewDidLoad'a koyar ve başka bir ekrandan dönüldüğünde tablonun yeniden yüklenmediğine şaşırır. Bir işlem her görüntülemede tekrarlanacaksa — viewWillAppear kullanın. Ömür boyunca bir kez yürütülecekse — viewDidLoad kullanın. UIViewController yaşam döngüsüyle ilgili çoğu sorunu önlemek için bu basit kuralı hatırlayın.
Gerçek projelerde viewDidLoad'ın doğru kullanımını gösteren üç pratik örneğe bakalım. Her örnek belirli bir ekran yapılandırma görevini çözer.
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 = "Merhaba, dünya!"
label.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(label)
NSLayoutConstraint.activate([
label.centerXAnchor.constraint(equalTo: view.centerXAnchor),
label.centerYAnchor.constraint(equalTo: view.centerYAnchor)
])
}
viewDidLoad'da ayrıca veri olmadığında görüntülenen öğeler yapılandırılır: boş durum, yükleyici, yer tutucu. Bu bileşenler bir kez oluşturulur ve ekran her göründüğünde yeniden kullanılır. Bu öğelerin gizlenmesi veya gösterilmesi, mevcut verilere bağlı olarak viewWillAppear'da yönetilir.
override func viewDidLoad() {
super.viewDidLoad()
emptyStateLabel = UILabel()
emptyStateLabel.text = "Veri yok"
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()
}
Sıkça Sorulan Sorular
Normal koşullarda, hayır — UIKit, View belleğe yüklendikten sonra viewDidLoad'ı bir kez çağırır. Denetleyici yok edilip yeniden oluşturulursa, viewDidLoad yeni örnek için çalışır.
Evet, kesinlikle. super.viewDidLoad çağırmak, UIKit'in Lifecycle'ın doğru çalışması için gerekli iç kurulumu yapmasını sağlar. Yöntem içinde her zaman önce super'i çağırın.
viewDidLoad View yüklendiğinde bir kez çağrılır. viewWillAppear ekran görünmeden önce her seferinde çağrılır. İlki tek seferlik kurulum için, ikincisi veri ve durum güncellemesi içindir.
viewDidLoad'daki ağır senkron işlemler ana iş parçacığını bloke eder ve ekranın görünmesini geciktirir. Zaman uyumsuz yüklemeler kabul edilebilir, ancak tamamlandığında UI'ı güncellerken ekranın zaten gizlenmiş olabileceği dikkate alınmalıdır.
viewDidLoad'ı doğrudan çağıramazsınız — UIKit çağırır. View'ın yüklenmesini zorlamak için controller.view özelliğine erişin. Bu otomatik olarak loadView ve viewDidLoad'ı tetikleyecektir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun