ViewController Lifecycle — iOS-da UIKit tərəfindən ekranların idarə edilməsi zamanı avtomatik çağırılan metodlar ardıcıllığıdır. Apple Documentation-a görə, hər bir UIViewController proqnozlaşdırıla bilən vəziyyətlər dəstindən keçir: View-in yaradılmasından onun görünməsi və gizlənməsinə qədər. Bu metodların sırasını və məqsədini anlamaq iOS tətbiqinin sabit işləməsi üçün zəruri şərtdir.
Başlıca
ViewController Lifecycle — UIViewController-ın mövcudluğu boyunca UIKit-dən aldığı metodlar toplusudur. iOS tətbiqindəki hər bir ekran ardıcıl olaraq yaradılma, View-in yüklənməsi, ekranda görünmə, yoxa çıxma və yaddaşın boşaldılması mərhələlərindən keçir. UIKit hər mərhələdə müvafiq metodları avtomatik çağırır və tərtibatçı öz məntiqini əlavə edərək onları ləğv edir.
UIViewController Arxitekturası UIKit-in əsasını təşkil edir və SwiftUI dövründə belə aktuallığını qoruyur — bir çox layihələr klassik yanaşmadan və ya hibrid Arxitekturadan istifadə edir. Lifecycle-i anlamaq subviews-ın hansı anda əlçatan olduğunu, layout-un nə vaxt təhlükəsiz dəyişdirilə biləcəyini və ekranın görünməsi və ya gizlənməsi zamanı hansı əməliyyatların yerinə yetiriləcəyini proqnozlaşdırmağa imkan verir.
Həyat dövrü metodlarının hər birinin xüsusi məqsədi var: bəziləri nəzarətçinin mövcudluğu boyunca bir dəfə, digərləri isə hər görünmə və ya gizlənmədə çağırılır. Metodlar arasında məntiqi qarışdırmaq çətin aşkarlanan səhvlərə gətirib çıxarır: yaddaş sızıntıları, səhv məlumat yenilənmələri və lazımsız şəbəkə sorğuları.
Altı metod UIViewController-ın tam həyat dövrünü təşkil edir. Onların çağırılma sırası sabitdir və naviqasiya üsulundan asılı deyil — push, present və ya unwind segue eyni cədvələ əməl edir.
loadView — dövrün ilk metodu, nəzarətçinin View-i hələ mövcud olmadıqda çağırılır. Storyboard istifadə edirsinizsə, UIKit avtomatik olaraq View-i xib faylından yükləyir. interfeysi proqram vasitəsilə yaratdıqda bu metodu ləğv edir və kök View-i əl ilə təyin edirsiniz. Əksər layihələrdə loadView-ə toxunulmur — iş viewDidLoad-da aparılır.
loadView-i ləğv etmək yalnız xüsusi hallarda tələb olunur: bütün interfeys Storyboard olmadan kodla yaradıldıqda və ya kök View qeyri-standart sinifdən olmalı olduqda. Apple ləğv edərkən super.loadView-ə müraciət etməməyi tövsiyə edir — View-in yaradılmasını tamamilə öz üzərinizə götürürsünüz.
override func loadView() {
view = UIView()
view.backgroundColor = .white
}
viewDidLoad — dövrün ən çox istifadə olunan metodudur. View yaddaşa yükləndikdən sonra, lakin hələ ekranda göstərilməmişkən bir dəfə çağırılır. Burada subviews konfiqurasiya edilir, cədvəllər məlumatlarla doldurulur, hücrələr qeydiyyatdan keçirilir və nəzarətçinin bütün ömrü boyu fəaliyyət göstərən bildirişlərə abunə olunur.
Əhəmiyyətli xüsusiyyət: viewDidLoad ekranın təkrar göstərilməsi zamanı təkrar çağırılmır. Hər görünmədə məlumatları yeniləmək lazımdırsa — viewWillAppear-dan istifadə edin. viewDidLoad-da yalnız əsas konfiqurasiyadan asılı olan birdəfəlik əməliyyatları yerləşdirin.
viewWillAppear hər dəfə View istifadəçi üçün görünməzdən əvvəl bilavasitə çağırılır. Bu metod animated parametrini alır ki, bu da görünmənin animasiya ilə baş verib-vermədiyini göstərir. Burada məlumatlar yenilənir, cədvəllər yenidən yüklənir, NavigationBar konfiqurasiya edilir və tətbiqin vəziyyətindən asılı olaraq elementlər gizlədilir və ya göstərilir.
viewWillAppear-dan ekranlar arasında vəziyyətin sinxronlaşdırılması üçün istifadə edin: əgər istifadəçi əvvəlki ekranda məlumatları dəyişmiş ola bilərsə, bu metod interfeysi yeniləmək üçün düzgün yerdir. Hər viewWillAppear çağırışı, hətta alt nəzarətçidən qayıdarkən belə, ekranın görünməsindən əvvəl baş verir.
viewDidAppear View-in ekranda tam göründüyünü və bütün keçid animasiyalarının tamamlandığını bildirir. Bu anda ekran qarşılıqlı əlaqəyə hazırdır — istifadəçi tam interfeysi görür və onunla işləyə bilər. Bu metod görünmədən sonra başlamalı olan animasiyaları işə salmaq, taymerləri başlatmaq və analitika göstərişlərini izləmək üçün uyğundur.
viewWillAppear-dan fərqli olaraq, viewDidAppear ekranın təkcə görünür deyil, həm də tam çəkilmiş olduğunu təmin edir. viewWillAppear-da animasiya işə salırsınızsa, bəzi kadrların ötürülməsi mümkündür, çünki UIKit keçidi hələ tamamlamamışdır. Hamar animasiyalar üçün viewDidAppear-dan istifadə edin.
viewWillDisappear View-in ekrandan yoxa çıxmasından əvvəl çağırılır — başqa nəzarətçiyə keçid, modal pəncərənin bağlanması və ya tətbiqin kiçildilməsi zamanı. Bu, vəziyyəti saxlamaq, bildirişlərdən çıxmaq, aktiv prosesləri dayandırmaq və ekran görünmədikdə lazım olmayan resursları boşatmaq üçün düzgün yerdir.
Xatırlamaq vacibdir: viewWillDisappear View-in nəhayətdə yoxa çıxacağına zəmanət vermir — jest ləğv edilə bilər. Buna görə kritik məlumatları həmçinin yalnız faktiki yoxa çıxmadan sonra çağırılan viewDidDisappear-da saxlayın.
viewDidDisappear görünmə və yoxa çıxma dövrünü tamamlayır. View artıq ekrandan gizləndikdən sonra çağırılır. Bu metodda animasiyalar tamamilə dayandırılır, müvəqqəti obyektlər silinir və viewWillDisappear-da başladılan məlumatların saxlanması təsdiqlənir.
Bu metod həmçinin nəzarətçinin deinit-indən əvvəl gəlir — əgər UIViewController məhv edilirsə, viewDidDisappear deinit çağırılmazdan əvvəl Lifecycle-ın son metodu olacaqdır. Obyekt məhv edilməzdən əvvəl baş verməli olan yekun təmizləmə üçün istifadə edin.
Çağırılma ardıcıllığı ekranın necə göründüyündən asılıdır: ilk dəfə, geri qayıdarkən və ya modal göstərilərkən. UIKit baxımından üç əsas ssenarini nəzərdən keçirək.
Ekranın ilk görünməsində UIKit tam yaradılma dövründən keçir: loadView, sonra viewDidLoad çağırılır, ardından görünmə animasiyası başlayır. Animasiya zamanı viewWillAppear, bitdikdən sonra isə viewDidAppear çağırılır. Bu, loadView-dən viewDidAppear-a qədər bütün metodların ardıcıl çağırıldığı yeganə ssenaridir.
override func viewDidLoad() {
super.viewDidLoad()
print("viewDidLoad — View yaddaşa yükləndi")
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print("viewWillAppear — tezliklə görünəcək")
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("viewDidAppear — ekran tam görünür")
}
İstifadəçi əvvəlki ekrana qayıtdıqda, UIKit viewDidLoad-ı təkrar çağırmır — View artıq yaddaşa yüklənmiśdir. Bunun əvəzinə qayıdan ekranda yalnız viewWillAppear və viewDidAppear, cari ekranda isə viewWillDisappear və viewDidDisappear işləyir. loadView və viewDidLoad ötürülür, çünki ekran artıq naviqasiya yığınında mövcuddur.
Modal göstərmə eyni qaydalara tabedir: yeni nəzarətçi ilk görünmədə tam dövrdən keçir, cari isə viewWillDisappear və viewDidDisappear çağırır. Dismiss zamanı sıra tərsinədir: qayıdan nəzarətçidə viewWillAppear və viewDidAppear, gizlənən nəzarətçidə isə tamamlayıcı metodlar işləyir. Bu davranış UIKit-dəki bütün keçid növləri üçün vahiddir.
Lifecycle-i anlamağın kod keyfiyyətinə və istifadəçi təcrübəsinə birbaşa təsir etdiyi dörd əsas ssenarini nəzərdən keçirək. Hər ssenari üçün tövsiyələrlə nümunə veririk.
viewDidLoad — ekranın görünməsindən asılı olmayan ilkin qurulma üçün yerdir. Burada collectionView konfiqurasiya edilir, hücrələr üçün nib faylları qeydiyyatdan keçirilir, data source və layout yaradılır. Şəbəkədən məlumat yükləyirsinizsə, viewDidLoad-da yalnız sorğunu başlatmaq, interfeysi isə ekran göstərilməyə hazır olduqda viewWillAppear-da yeniləmək daha yaxşıdır.
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(
MyCell.self,
forCellReuseIdentifier: MyCell.identifier
)
viewModel.loadInitialData()
}
Ekran hər görünəndə məlumatları sinxronlaşdırmaq üçün viewWillAppear-dan istifadə edin. Məsələn, istifadəçi əvvəlki ekranda parametrləri dəyişmiş ola bilərsə, burada göstərilən dəyərlər yenilənir, cədvəl yenidən yüklənir və NavigationBar-ın vəziyyəti düzəldilir. Bu, ekranın istənilən naviqasiya ssenarisində həmişə aktual məlumatları göstərməsini təmin edir.
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tableView.reloadData()
navigationController?.setNavigationBarHidden(false, animated: animated)
}
viewDidAppear istifadəçi ekranı gördükdən sonra başlamalı olan animasiyaları işə salmaq üçün idealdır. Burada həmçinin analitika hadisələri göndərilir: ekranın göstərilməsi, onboarding-in başlanması və ya video oxutmanın başlaması. Keçid tamamlanmazdan əvvəl animasiyaları işə salmaq sərçəli interfeysə gətirib çıxarır — UIKit kifayət qədər kadr hazırlamağa vaxt tapmır.
viewWillDisappear-da qaralamalar saxlanılır, taymerlər dayandırılır və NotificationCenter-dən çıxılır. Bu, ekranın hələ göründüyü və istifadəçi kontekstini tələb edən əməliyyatlar üçün əlçatan olduğu son andır. Kritik məlumatlar üçən əlavə olaraq ləğv edilmiş jestlərdən qorunmaq üçün viewDidDisappear-dan istifadə edilir.
Həyat dövrü metodlarının yanlış istifadəsi iOS tətbiqlərində səhvlərin ən geniş yayılmış mənbələrindən biridir. UIViewController ilə işləyərkən tərtibatçıların müxtəlif mərhələlərdə yol verdiyi əsas səhvləri nəzərdən keçirək.
Birinci səhv — Storyboard varkən init və ya loadView-də subviews yaratmaq. Interface Builder istifadə edirsinizsə, loadView-i lazımsız yerə ləğv etməyin. Mövcud storyboard ilə loadView-də View yaratmaq xib faylının nəzərdən qaçırılmasına və boş ekrana gətirib çıxarır.
İkinci səhv — viewDidLoad-da klaviatura bildirişlərinə abunə olub çıxmamaq. UIResponder.keyboardWillShowNotification-a abunə olmusunuzsa, lakin ekran gizlənərkən çıxmamısınızsa, blok nəzarətçinin deinit-indən sonra da çağırılacaq — bu, tətbiqin potensial çökməsi ilə yaddaş sızıntısıdır.
Üçüncü səhv — ekran görünməmişkən işə salınan taymerlər və şəbəkə sorğuları. View hələ görünmədikdə şəkillərin yüklənməsi və ya animasiyaların icrası resursların boş yerə sərf edilməsidir. Vizual yeniləmələri viewWillAppear və ya viewDidAppear-a köçürün.
Dördüncü səhv — məlumatları yalnız viewWillDisappear-da saxlamaq. interaktiv pop jesti zamanı istifadəçi sürüşdürməyə başlayıb ləğv edə bilər — metod çağırıldı, lakin ekran yoxa çıxmadı. Kritik məlumatların saxlanmasını viewDidDisappear-da və ya applicationDidEnterBackground handlerində təkrarlayın.
Tez-tez verilən suallar
Bir dəfə — View yaddaşa yükləndikdən sonra. Ekranın təkrar görünməsində viewDidLoad çağırılmır. View-i yenidən yaratmaq lazımdırsa, nəzarətçi məhv edilməli və yenidən yaradılmalıdır.
UIKit həyat dövrü üçün super.viewDidLoad-ın çağırılmasını tələb edir. Olmadan layout yenilənməsi və keçid emalı ilə bağlı problemlər yarana bilər. Həmişə metoda ilk olaraq super-i çağırın.
Tövsiyə edilmir. Nəzarətçi Storyboard-dan initallaşdırılıbsa, UIKit avtomatik olaraq View-i xib-dən yükləyir. loadView-i ləğv etmək bu prosesi ləğv edir və storyboardınız nəzərdən qaçırılacaq.
viewDidLoad və ya viewWillAppear-da abunə olun, viewWillDisappear və ya viewDidDisappear-da isə bağlantını kəsin, self-ə zəif istinaddan istifadə edərək qapanmalarda yaddaş sızıntılarından qaçının.
Force quit prosesi məcburi şəkildə dayandırır — UIKit Lifecycle metodlarını çağırmağa vaxt tapmır. Məlumatları saxlamaq üçün AppDelegate-də UIApplication.willTerminateNotification bildirişindən istifadə edin.
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