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 — 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-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.
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.
override func viewDidLoad() {
super.viewDidLoad()
print("View yükləndi — interfeysi qurmaq olar")
setupUI()
configureTableView()
}
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.
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 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.
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.
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
tableView.register(
CustomCell.self,
forCellReuseIdentifier: CustomCell.identifier
)
title = "Əsas ekran"
}
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.
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.
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.
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.
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 = "Salam, dünya!"
label.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(label)
NSLayoutConstraint.activate([
label.centerXAnchor.constraint(equalTo: view.centerXAnchor),
label.centerYAnchor.constraint(equalTo: view.centerYAnchor)
])
}
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.
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)
}
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
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.
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 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.
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.
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ə
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.
Həm də oxuyun