iOS'ta viewDidLoad: nedir, amacı ve kod örnekleri

Yazar: IT Sectr Yayınlanma: 2026-03-05 Okuma süresi: 8 dk

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, View belleğe yüklendikten sonra bir kez çağrılır
  • super.viewDidLoad zorunludur — onsuz Lifecycle bozulur
  • Bu yöntemde UI yapılandırılır, hücreler kaydedilir ve data source oluşturulur
  • Ekrana geri dönüldüğünde yeniden çağrılmaz — viewWillAppear kullanın
  • Tek seferlik işlemler ve kalıcı bildirimlere abone olmak için uygundur

viewDidLoad nedir

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 ne zaman çağrılır

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.

Ekran ilk göründüğünde

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.

swift
override func viewDidLoad() {
    super.viewDidLoad()
    print("View yüklendi — arayüzü yapılandırabilirsiniz")
    setupUI()
    configureTableView()
}

Mevcut bir ekrana geri dönüldüğünde

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.

forcedViewLoad'da

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'da ne yapılmalı

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.

UI bileşenlerinin yapılandırılması

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.

swift
override func viewDidLoad() {
    super.viewDidLoad()
    tableView.dataSource = self
    tableView.delegate = self
    tableView.register(
        CustomCell.self,
        forCellReuseIdentifier: CustomCell.identifier
    )
    title = "Ana ekran"
}

Veri başlatma ve abonelikler

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.

Navigasyon kurulumu

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.

viewDidLoad'da ne yapılmamalı

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.

viewDidLoad ile kod örnekleri

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.

Örnek 1: özel hücrelerle koleksiyon yapılandırma

swift
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()
}

Örnek 2: programatik olarak kısıtlamalar ayarlama

swift
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)
    ])
}

Örnek 3: boş durum ve yükleyici yapılandırma

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.

swift
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)
}

Örnek 4: uygulama bildirimlerine abone olma

swift
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

viewDidLoad birden fazla kez çağrılabilir mi?

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.

super.viewDidLoad çağırmalı mıyım?

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 ve viewWillAppear arasındaki fark nedir?

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'da ağır işlemler yapabilir miyim?

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 nasıl zorla çağrılı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

  • viewDidLoad, View belleğe yüklendikten sonra çağrılan tek seferlik bir UIViewController kurulum yöntemidir
  • View'a ilk erişimde denetleyicinin ömrü boyunca bir kez çağrılır
  • Hücre kaydı, delegate yapılandırması, viewModel başlatma için uygundur
  • Doğru Lifecycle için her zaman super.viewDidLoad çağırın
  • View boyutlarına bağlı işlemler için viewDidLoad kullanmayın
  • Her görünümde veri güncellemek için viewWillAppear kullanın
  • Kalıcı bildirimlere abone olmak uygundur, geçici olanlara — viewWillAppear'da

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.

Projeyi tartış

Ayrıca okuyun