viewWillAppear — bu UIViewController metodudur, UIKit onu hər dəfə ekran istifadəçiyə görünməzdən əvvəl çağırır. Apple Developer Documentation-ya görə, bu metod keçidin animasiya ilə olub-olmadığını göstərən animated boolean parametri qəbul edir. viewWillAppear — məlumatları yeniləmək və ekran vəziyyətini sinxronlaşdırmaq üçün əsas yerdir.
Başlıca
viewWillAppear — bu UIViewController metodudur, UIKit onu View pəncərələr iyerarxiyasına əlavə edilməzdən dərhal əvvəl çağırır. Bu anda View Auto Layout keçidlərindən sonra son ölçülərə malikdir, lakin hələ istifadəçiyə görünmür — keçid animasiyası ya başlamayıb, ya da icra olunur. Tərtibatçı bu metodu hər dəfə ekran göstərilməzdən əvvəl baş verməli olan əməliyyatları yerinə yetirmək üçün ləğv edir.
Bir dəfə işləyən viewDidLoad-dən fərqli olaraq, viewWillAppear ekran görünmək üzrə olanda hər dəfə çağırılır: ilkin açılışda, uşaq kontrollerdən qayıtdıqda, modal pəncərə bağlandıqda və TabBar əlavələri dəyişdirilərkən. Bu onu interfeysin cari vəziyyətini qorumaq üçün əsas metoda çevirir.
Metod Bool tipli animated parametri qəbul edir, o, ekranın görünməsinin animasiya ilə müşayiət olunub-olunmadığını göstərir. Bu parametri ardıcıl davranış üçün oxşar parametrə malik olan NavigationBar və TabBar metodlarına ötürmək rahatdır.
Vaxtlama viewWillAppear çağırışı naviqasiya növündən asılıdır, lakin ümumi qayda dəyişməz: metod View görünməzdən əvvəl işləyir. Əsas ssenariləri nəzərdən keçirək.
viewDidLoad çağırıldıqdan sonra UIKit göstərməyə hazırlığa başlayır: View iyerarxiyaya əlavə edilir, layout keçidləri işlədilir və keçid animasiyası başlamazdan dərhal əvvəl viewWillAppear çağırılır. Bu anda ekran hələ görünmür, lakin bütün subviews düzgün ölçülərə malikdir və onların məzmununu təhlükəsiz şəkildə yeniləmək olar.
İstifadəçi geri düməsini basdıqda və ya proqramlı şəkildə popViewController çağırdıqda, UIKit əvvəlki ekrana qayıdır və onun viewWillAppear metodunu çağırır. Bu, viewWillAppear-ın istifadə edildiyi əsas ssenaridir — element əlavə edildikdən sonra siyahını yeniləmək və ya parametrləri sinxronlaşdırmaq.
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tableView.reloadData()
updateBadgeCount()
}
Modal şəkildə təqdim edilmiş kontroller bağlandıqdan sonra UIKit onu təqdim edən kontrollerdə viewWillAppear çağırır. Bu ssenari, məlumatları geri qaytarmaq üçün delegate və ya closure-lardan istifadə edirsinizsə, xüsusi diqqət tələb edir — viewWillAppear ekranın nəticəni aldıqdan sonra yenilənəcəyinə zəmanət verir.
TabBarController hər dəfə əlavə dəyişdirilərkən seçilmiş əlavənin kontrollerində viewWillAppear çağırır. Ɖlavədə dinamik məlumatlar göstərilirsə — valyuta məzənnələri, bildirişlər, istifadəçi statusu — viewWillAppear onları yeniləmək üçün ideal yerdir.
viewWillAppear digər metodlarda yerinə yetirilə bilməyən və ya optimal olmayan bir neçə konkret tapşırığı həll edir. Onlardan əsas olanları nəzərdən keçirək.
viewWillAppear-ın ən çox istifadə olunan tətbiqi — ekran hər görünəndə UITableView və ya UICollectionView-ı yenidən yükləmək. Əgər məlumatlar əvvəlki ekranda dəyişə bilərsə (element əlavə edilməsi, status dəyişikliyi), viewWillAppear-da reloadData çağırmaq istifadəçinin aktual məlumat görməsinə zəmanət verir.
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
viewModel.synchronize()
tableView.reloadData()
}
viewWillAppear-da NavigationBar-ın görünüşünü konfiqurasiya etmək rahatdır: onu gizlətmək və ya göstərmək, rəngini dəyişmək, large title təyin etmək. Müxtəlif ekranlarda NavigationBar fərqli görünürsə, viewWillAppear bu dəyişikliklər üçün düzgün yerdir, çünki viewDidLoad yalnız bir dəfə çağırılır.
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.setNavigationBarHidden(
false, animated: animated
)
navigationController?.navigationBar.prefersLargeTitles = true
tabBarController?.tabBar.isHidden = false
}
Yalnız ekran görünərkən məna kəsb edən bildirişlər — klaviatura, məzmun dəyişikliyi bildirişləri — viewWillAppear-da abunə olunur və viewDidDisappear-da ləğv edilir. Bu, ekran aktiv olmadıqda əlavə handlerlərin qarşısını alır və yaddaş sızıntılarından qoruyur.
Ekran tətbiq tərəfindən gizlədilə bilərsə və ya kiçəldilə bilərsə, viewWillAppear UI vəziyyətini bərpa etmək üçün rahat yerdir: seqmentləri dəyişmək, scroll vəziyyətini bərpa etmək, müvəqqəti dəyişiklikləri sıfırlamaq. İstifadəçi hər dəfə görünəndə ekranı proqnozlaşdırıla bilən formada alır.
Oxunmamış mesajların, reytinqlərin və ya bildirişlərin sayıcılarını göstərən ekranlarda viewWillAppear onları yeniləmək üçün düzgün yerdir. İstifadəçi başqa ekranda miqdarı dəyişə bilərsə, burada UITabBarItem.badgeValue və ya fərdi göstəricilərin yenidən hesablanması və yenilənməsi çağırılır. Bu, istifadəçinin digər ekranlarda nə qədər qaldığından asılı olmayaraq həmişə aktual rəqəmləri görməsinə zəmanət verir.
Ayrıca collectionView ilə işi qeyd etmək lazımdır: ekrandakı məlumatlar sayıcılar və ya statusları olan hücrələrdən ibarət şəbəkə şəklində təqdim olunursa, onların viewWillAppear-da yenilənməsi seçici olmalıdır. Tam reloadData əvəzinə, yanıb-sönmə və scroll vəziyyətinin itirilməsinin qarşısını almaq üçün görünən hücrələr üçün reloadItemsAtIndexPaths istifadə edin.
viewWillAppear və viewDidLoad arasındakı fərqi başa düşmək düzgün UIViewController arxitekturasının əsasıdır. Bu metodlar müxtəlif çağırılma tezliyinə, müxtəlif kontekstə və müxtəlif məqsədə malikdir.
viewDidLoad bir dəfə çağırılır və zamanla dəyişmayən konfiqurasiya üçün uyğundur: hücrələrin qeydiyyatı, delegate-lərin təyini, sabitlərin işə salınması. viewWillAppear hər görünmədə çağırılır və təkrarlanmalı olan əməliyyatlar üçün uyğundur: məlumatların yenilənməsi, görünən elementlərin konfiqurasiyası, vəziyyətin sinxronlaşdırılması.
| Xarakteristika | viewDidLoad | viewWillAppear |
|---|---|---|
| Tezlik | Bir dəfə | Hər dəfə görünəndə |
| View görünür | Yox | Yox (tezliklə görünəcək) |
| View ölçüləri | Son deyil | Son |
| Uyğundur | Birdəfəlik konfiqurasiya | Yeniləmə və sinxronlaşdırma |
| Animasiya | Tətbiq edilmir | animated parametri |
Qızıl qayda: əməliyyat yalnız bir dəfə yerinə yetirilməlidirsə — viewDidLoad-a qoyun. Hər dəfə ekrana qayıdarkən təkrarlanmalıdırsa — viewWillAppear-a qoyun.
Yanlış istifadə viewWillAppear məhsuldarlıq problemlərinə, həddindən artıq yeniləmələrə və interfeysin uyğunsuz vəziyyətinə səbəb ola bilər. Ən tez-tez rast gəlinən səhvləri nəzərdən keçirək.
Birinci səhv — viewDidLoad məntiqinin təkrarlanması. Həm viewDidLoad-da, həm də viewWillAppear-da cədvəl hücrələrini qeydiyyatdan keçirirsinizsə — qeydiyyat dəfələrlə yerinə yetiriləcək, halbuki birdəfəlik konfiqurasiya kifayətdir. Bütün birdəfəlik konfiqurasiyaları viewDidLoad-a köçürün.
İkinci səhv — hər görünmədə şərtsiz reloadData. Məlumatlar dəyişməyibsə, cədvəli yenidən yükləmək data source-a əlavə sorğulara və hücrələrin yenidən çəkilməsinə səbəb olur, məhsuldarlığı azaldır. reloadData çağırmazdan əvvəl vəziyyətin həqiqətən dəyişib-dəyişmədiyini yoxlayın.
Üçüncü səhv — sorğu tamamlanmazdan əvvəl ekranın yenidən gizlədilə biləcəyini nəzərə almadan şəbəkə sorğuları ilə işləmək. viewWillAppear-da URLSession sorğusu başlatdıqda və istifadəçi dərhal başqa ekrana keçdikdə, nəticə artıq gizlədilmiş View-ə tətbiq oluna bilər. Yeniləmədən əvvəl ləğv edilə bilən tapşırıqlardan istifadə edin və ya isViewLoaded və window-u yoxlayın.
Dördüncü səhv — super çağırmağı unutmaq. super.viewWillAppear çağırmamaq valideyn kontrollerlərin (UINavigationController, UITabBarController) işini poza bilər və jestlərin və keçidlərin düzgün işlənməməsinə səbəb ola bilər. super həmişə çağırılmalıdır.
Beşinci səhv — layoutIfNeeded çağırmadan constraint-lərin dəyişdirilməsi. viewWillAppear-da proqramlı şəkildə constraints dəyişdirirsinizsə, UIKit onları dərhal tətbiq etmir — dəyişikliklər növbəti layout keçidinə qədər yığılır. Constraint dəyişikliklərindən sonra dərhal tətbiq etmək üçün view.layoutIfNeeded() çağırın. Bu, məzmundan asılı elementlərin hündurluğunu təyin edərkən xüsusilə vacibdir.
Altıncı səhv — viewWillAppear-da animasiya yerinı yetirmək cəhdi. Yuxarıda qeyd edildiyi kimi, UIKit hələ də keçid animasiyasını emal edir və sizin animasiyanız sistem animasiyası ilə rəqabət edə bilər. Elementin effektlə görünməsinə ehtiyacınız varsa, viewDidAppear-da giriş animasiyasından istifadə edin, viewWillAppear-da isə yalnız ilkin vəziyyəti konfiqurasiya edin: şəffaflıq 0, transform miqyası 0.8 və s.
Yeddinci səhv — animated parametrinin görməməzdən gəlinməsi. Bəzi tərtibatçılar viewWillAppear-da animated dəyərini yoxlamır və animasiyanın olmasından asılı olmalı əməliyyatları yerinə yetirirlər. Məsələn, NavigationBar-ı animated = false olduqda animasiyasız, animated = true olduqda isə animasiya ilə gizlətmək olar ki, keçid hamar görün-sün. animated parametrini həmişə müvafiq UIKit metodlarına ötürün.
Səkkizinci səhv — görünməyən ekranda UI modifikasiyası. viewWillAppear-da şəbəkə sorğusu başlatdıqda və onun completion block-u UI-nı yeniləyərkən ekran artıq yox ola bilərsə, istifadəçi yanıb-sönmə və ya uyğunsuz vəziyyət görəcək. Closure-larda UI yeniləməzdən əvvəl həmişə isViewLoaded və window-u yoxlayın. Bu sadə hərəkət crash-ların və əlavə interfeys yenidən çəkilmələrin qarşısını alır.
Tez-tez verilən suallar
viewWillAppear görünmə animasiyası başlamazdan əvvəl, View hələ görünmədikdə çağırılır. viewDidAppear — animasiya bitdikdən sonra, ekran tam göstərildikdə və qarşılıqlı əlaqə üçün əlçatan olduqda çağırılır.
Normal şəraitdə viewWillAppear ekran görünəndə həmişə çağırılır. İstisna — tətbiqin məcburi bağlanması (force quit), bu halda UIKit Lifecycle metodlarını çağırmağa vaxt tapmır.
Bəli, mütləq. UIKit bu çağırışı UINavigationController və UITabBarController ilə daxili koordinasiya üçün istifadə edir. Super olmadan jestlər və keçid animasiyaları poçula bilər.
Hər dəfə əlavə dəyişdirilərkən. UIKit istifadəçi TabBar-da müvafiq işarəyə toxunan kimi seçilmiş əlavənin kontrollerində viewWillAppear çağırır.
Kontrollerin xassələrini və ya ümumi data source istifadə edin. popViewController çağırmazdan əvvəl əvvəlki kontrollerdə lazımi dəyərləri təyin edin və onun viewWillAppear-ında onlar artıq əlçatan olacaq.
Nəticə
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