viewDidLoad iOS-da: bu nədir, məqsədi və kod nümunələri

Müəllif: IT Sectr Dərc olunub: 2026-03-05 Oxuma vaxtı: 8 dəq

viewDidLoad — UIKit-in UIViewController-in View-i yaddaşa yüklədikdən sonra çağırdığı ilk metoddur. Apple Developer Documentation-a görə, bu metod kontrolörün mövcud olduğu müddət ərzində cəmi bir dəfə çağırılır. viewDidLoad interfeysin ilkin qurulması, hüceyrələrin qeydiyyatı və məlumatların işə salınması üçün əsas yerdir.

Əsas məqamlar

  • viewDidLoad View yaddaşa yükləndikdən sonra bir dəfə çağırılır
  • super.viewDidLoad məcburidir — onsuz Lifecycle pozulur
  • Bu metoda UI qurulur, hüceyrələr qeydiyyatdan keçirilir və data source yaradılır
  • Yenidən çağırılmır ekrana qayıtdıqda — viewWillAppear istifadə edin
  • Birdəfəlik əməliyyatlar və daimi bildirişlərin abunəsi üçün uyğundur

viewDidLoad nədir

viewDidLoad — UIKit-in kontrolörün View-i operativ yaddaşa yükləndikdən dərhal sonra çağırdığı UIViewController nümunə metodudur. Bu anda bütün IBOutlet xüsusiyyətləri artıq interfeys elementləri ilə birləşdirilib, lakin View hələ pəncərələr iyerarxiyasına əlavə edilməyib və istifadəçiyə görünmür. Tərtibatçı ekranın ilkin konfiqurasiyasını yerinə yetirmək üçün bu metodu yenidən təyin edir.

Metod ViewController Lifecycle-in bir hissəsidir və View proqramlı şəkildə yaradılırsa loadView-dan dərhal sonra və ya Storyboard-dan yükləndikdən sonra gəlir. Tipik bir layihədə viewDidLoad ən çox yenidən təyin edilən UIViewController metodudur, çünki o, artıq mövcud olan və konfiqurasiyaya hazır olan subviews ilə işləmək üçün təhlükəsiz nöqtə təmin edir.

Vacib detal: viewDidLoad çağırıldığı anda View-in ölçüləri hələ finala uyğun gəlmir — Auto Layout keçidləri tamamlamayıb və frame gözləniləndən fərqlənə bilər. Ölçülərdən asılı hesablamalar üçün viewDidLayoutSubviews istifadə olunur.

viewDidLoad nə vaxt çağırılır

viewDidLoad-un çağırılma vaxtı kontrolörün necə işə salınmasından asılıdır. Əksər hallarda UIKit bu metodu kontrolörün view xüsusiyyətinə ilk müraciət zamanı avtomatik çağırır — buna UIViewController-in lazy-loading mexanizmi deyilir.

Ekranın ilk açılışında

NavigationController və ya TabBarController ekranınızı ilk dəfə göstərdikdə, UIKit View-in yüklənib-yüklənmədiyini yoxlayır. Yüklənməyibsə — loadView (və ya Storyboard-dan yükləmə) çağırılır, ardınca dərhal viewDidLoad işə düşür. Bu standart ssenaridir və kontrolörün hər bir nümunəsi üçün bir dəfə baş verir.

swift
override func viewDidLoad() {
    super.viewDidLoad()
    print("View yükləndi — interfeysi qurmaq olar")
    setupUI()
    configureTableView()
}

Mövcud ekrana qayıtdıqda

viewDidLoad yenidən çağırılmır back button və ya dismiss vasitəsilə ekrana qayıtdıqda. Əgər məntiqiniz ekranın yenidən görünməsindən asılıdırsa — onu viewWillAppear-da yerləşdirin. Bu ən çox yayılmış konseptual səhvlərdən biridir: tərtibatçılar viewDidLoad-un hər göstərişdə işə düşəcəyini gözləyirlər, lakin UIKit onu cəmi bir dəfə çağırır.

ForcedViewLoad zamanı

Bəzən tərtibatçılar yükləməni əvvəlcədən başlatmaq üçün kontrolörün view-ni məcburi çağırırlar: let _ = controller.view. Bu, kontrolör ekranda görünməzdən əvvəl loadView və viewDidLoad-u məcbur edir. Bu üsul hamar keçid üçün View-i əvvəlcədən hazırlamaq lazım olduqda istifadə olunur.

viewDidLoad-da nə edilir

viewDidLoad ekranın görünüb-görünməməsindən asılı olmayan birdəfəlik konfiqurasiya əməliyyatları üçün nəzərdə tutulub. Bu metodun düzgün istifadəsi təmiz arxitektura və kontrolörün proqnozlaşdırıla bilən davranışının təminatıdır.

UI komponentlərinin qurulması

viewDidLoad-da UITableView və UICollectionView üçün nib faylları və siniflər qeydiyyatdan keçirilir, deleqatlar qurulur, UI elementlərinin xüsusiyyətlərinin ilkin dəyərləri təyin edilir. Bütün IBOutlet-lər bu anda artıq birləşdirildiyi üçün label.text, imageView.image və digər subviews xüsusiyyətlərinə təhlükəsiz müraciət etmək olar.

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

Məlumatların işə salınması və abunələr

Burada viewModel yaradılır, data source massivlərlə işə salınır, kontrolörün bütün ömrü boyu fəaliyyət göstərməli olan bildirişlərə abunə olunur. Məsələn, fondan qayıdarkən məlumatları yeniləmək üçün UIApplication.willEnterForegroundNotification abunəsi viewDidLoad üçün uyğun namizəddir. Müasir iOS arxitekturasında ViewModel kontrolörlə biznes məntiqi arasında əlaqələndirici rol oynayır və onun məhz viewDidLoad-da işə salınması ekranın ilk görünmə anında məlumatların hazır olmasını təmin edir.

Cədvəl və kolleksiyalar üçün data source qurulmasına xüsusi diqqət yetirin. Cədvəliniz Core Data ilə UIFetchedResultsController və ya NSFetchedResultsController istifadə edirsə, fetch request və deleqatı viewDidLoad-da işə salın. Bu, ekranın ilk görünməsində cədvəlin əlavə sorğular olmadan artıq məlumatlarla doldurulmasına zəmanət verir.

Naviqasiyanın qurulması

viewDidLoad-da NavigationBar düymələri konfiqurasiya edilir, large title təyin edilir, search controller əlavə edilir və edit/done düymələri qurulur. Bu elementlər ekranın təkrar göstərilməsində nadir hallarda dəyişir, ona görə də onların burada işə salınması optimaldır.

viewDidLoad-da nə etməməli

Bütün əməliyyatlar viewDidLoad üçün uyğun deyil. Bu metoda yerləşdirilən bəzi hərəkətlər həddindən artıq yaddaş istehlakına, səhv davranışa və ya ekranın təkrar göstərilməsində xətalara səbəb olur.

Yalnız UI-ya təsir edən şəbəkə sorğularını işə salmaqdan çəkinin. Sorğu ekran görünməzdən əvvəl tamamlanarsa, istifadəçi nəticəni görməyəcək, sonra tamamlanarsa — məlumatlar köhnəlmiş ola bilər. Yükləməni viewDidLoad-da başladın, lakin UI-nı viewWillAppear-da yeniləyin.

View-in ölçülərindən və yerləşməsindən asılı olan əməliyyatları viewDidLoad-da etməyin. Çağırış anında Auto Layout keçidləri tamamlamayıb və frame son ola bilməz. Hesablamalar üçün viewDidLayoutSubviews istifadə edin və ya updateViewConstraints-ı yenidən təyin edin.

Yalnız ekran görünəndə fəaliyyət göstərən bildirişlərə abunə olmayın. Klaviatura bildirişləri, uşaq kontrolörlərin məzmun dəyişikliyi bildirişləri — onlara viewWillAppear-da abunə olun və viewDidDisappear-da abunəni ləğv edin ki, lazımsız çağırışlar və sızıntılar olmasın.

Görünən ekran tələb edən metodları çağırmayın. Məsələn, viewDidLoad-dan UIAlertController göstərmək cəhdi xətaya səbəb olacaq, çünki kontrolörün View hələ pəncərələr iyerarxiyasına əlavə edilməyib. Window və ya presentedViewController-dən asılı olan bütün UI əməliyyatları yalnız ekran göründükdən sonra icra edilməlidir.

Ağır resursları ehtiyac olmadan işə salmayın. Ekran nadir hallarda açılırsa və ya məlumatlar dərhal göstərilmirsə, resurs tutumlu obyektlərin yaradılmasını onların həqiqətən lazım olduğu ana qədər təxirə salın. Swift-də xüsusiyyətlərin Lazy-inisializasiyası bu tapşırığı həll etmək üçün daxili mexanizmdir: lazy modifikatoru olan xüsusiyyət yalnız ilk müraciət zamanı yaradılır ki, bu da yaddaşa qənaət edir və ekranın yüklənməsini sürətləndirir.

viewDidLoad-u ekranın hər görünməsində yerinə yetirilməli olan əməliyyatlar üçün istifadə etməyin. Bu ən fundamental səhvdir: başlanğıc tərtibatçılar tez-tez məlumat yeniləmə məntiqini viewDidLoad-da yerləşdirir və başqa ekrandan qayıtdıqda cədvəlin yenidən yüklənmədiyinə təəccüblənirlər. Əməliyyat hər göstərişdə təkrarlanmalıdırsa — viewWillAppear istifadə edin. Ömrü boyu bir dəfə yerinə yetirilməlidirsə — viewDidLoad. UIViewController-in həyat dövrü ilə bağlı problemlərin əksəriyyətindən qaçmaq üçün bu sadə qaydanı xatırlayın.

viewDidLoad ilə kod nümunələri

Real layihələrdə viewDidLoad-un düzgün istifadəsini nümayiş etdirən üç praktik nümunəni nəzərdən keçirək. Hər bir nümunə ekranın qurulmasının konkret tapşırığını həll edir.

Nümunə 1: fərdi hüceyrələrlə kolleksiyanın qurulması

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

Nümunə 2: constraint-lərin proqramlı qurulması

swift
override func viewDidLoad() {
    super.viewDidLoad()
    let label = UILabel()
    label.text = "Salam, dünya!"
    label.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(label)

    NSLayoutConstraint.activate([
        label.centerXAnchor.constraint(equalTo: view.centerXAnchor),
        label.centerYAnchor.constraint(equalTo: view.centerYAnchor)
    ])
}

Nümunə 3: boş vəziyyət və loader qurulması

viewDidLoad-da həmçinin məlumat olmadıqda göstərilən elementlər qurulur: boş vəziyyət, loader, placeholder. Bu komponentlər bir dəfə yaradılır və ekranın hər görünməsində təkrar istifadə olunur. Bu elementlərin gizlədilməsi və ya göstərilməsi cari məlumatlardan asılı olaraq viewWillAppear-da idarə olunur.

swift
override func viewDidLoad() {
    super.viewDidLoad()
    emptyStateLabel = UILabel()
    emptyStateLabel.text = "Məlumat yoxdur"
    emptyStateLabel.textAlignment = .center
    emptyStateLabel.isHidden = true
    view.addSubview(emptyStateLabel)

    activityIndicator = UIActivityIndicatorView(style: .medium)
    activityIndicator.hidesWhenStopped = true
    view.addSubview(activityIndicator)
}

Nümunə 4: tətbiq bildirişlərinə abunə

swift
override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(
        self,
        selector: #selector(handleEnterForeground),
        name: UIApplication.willEnterForegroundNotification,
        object: nil
    )
}

@objc private func handleEnterForeground() {
    refreshContent()
}

Tez-tez verilən suallar

viewDidLoad birdən çox dəfə çağırıla bilərmi?

Normal şəraitdə yox — UIKit viewDidLoad-u View yaddaşa yükləndikdən sonra bir dəfə çağırır. Kontrolör məhv edilib yenidən yaradılarsa, viewDidLoad yeni nümunə üçün işə düşəcək.

super.viewDidLoad çağırmaq lazımdırmı?

Bəli, mütləq. super.viewDidLoad çağırışı UIKit-in Lifecycle-in düzgün işləməsi üçün zəruri olan daxili qurulmanı yerinə yetirməsinə zəmanət verir. Həmişə super-i metodun əvvəlində çağırın.

viewDidLoad və viewWillAppear arasında fərq nədir?

viewDidLoad View yüklənərkən bir dəfə çağırılır. viewWillAppear ekranın hər görünməsindən əvvəl çağırılır. Birincisi — birdəfəlik qurulma üçün, ikincisi — məlumatların və vəziyyətin yenilənməsi üçün.

viewDidLoad-da ağır əməliyyatlar etmək olarmı?

Ağır sinxron əməliyyatlar viewDidLoad-da main thread-i bloklayır və ekranın görünməsini gecikdirir. Asinxron yükləmələr icazəlidir, lakin onlar tamamlandıqda UI-nı yeniləyərkən ekranın artıq gizlənmiş ola biləcəyini nəzərə alın.

viewDidLoad-u məcburi necə çağırmaq olar?

Birbaşa viewDidLoad-u çağırmaq olmaz — onu UIKit çağırır. View-in yüklənməsini məcbur etmək üçün controller.view xüsusiyyətinə müraciət edin. Bu, loadView və viewDidLoad-u avtomatik işə salacaq.

Xülasə

  • viewDidLoad — View yaddaşa yükləndikdən sonra UIViewController-in birdəfəlik qurulma metodu
  • View-ə ilk müraciət zamanı kontrolörün ömrü boyu bir dəfə çağırılır
  • Hüceyrələrin qeydiyyatı, deleqatların qurulması, viewModel-in işə salınması üçün uyğundur
  • Lifecycle-in düzgün işləməsi üçün həmişə super.viewDidLoad çağırın
  • View ölçülərindən asılı əməliyyatlar üçün viewDidLoad istifadə etməyin
  • Hər görünmədə məlumatların yenilənməsi üçün viewWillAppear istifadə edin
  • Daimi bildirişlərə abunə — uyğun, müvəqqəti bildirişlərə — viewWillAppear-da

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun