viewWillDisappear UIViewController metodudur, UIKit onu ekran istifadəçinin displeyindən itməyə başlamazdan dərhal əvvəl çağırır. Apple Developer Documentation-ya görə, bu metod animated parametrini qəbul edir və push, pop, present, dismiss və tab keçidi zamanı işə düşür. viewWillDisappear — vəziyyəti saxlamaq və resursları düzgün təmizləmək üçün əsas yerdir.
Əsas məqamlar
viewWillDisappear UIViewController metodudur, UIKit onu View-in ekrandan itməyə başlamazdan dərhal əvvəl çağırır. Bu anda ekran istifadəçiyə hələ də görünür, lakin keçid artıq başladılıb: NavigationController push/pop animasiyasına başlayıb, modal pəncərə bağlanmağa başlayıb və ya TabBar başqa taba keçidə başlayıb. Tərtibatçı bu metodu ekranın hələ də əlçatan olduğu, lakin artıq gizlənməyə hazırlaşdığı əməliyyatları yerinə yetirmək üçün override edir.
viewDidDisappear-dan fərqli olaraq, ekran gizləndikdən sonra işə düşən, viewWillDisappear istifadəçinin interfeysi hələ də gördüyü vaxt məlumatları saxlamaq və resursları boşaltmaq üçün son fürsəti təmin edir. Bu UX üçün kritik əhəmiyyətlidir — qaralamanın saxlanması və ya taymerin dayandırılması istifadəçi başqa ekrana keçməzdən əvvəl baş verməlidir.
Metod animated parametrini qəbul edir, bu itmənin animasiya ilə olub-olmadığını göstərir. true dəyəri UIKit-in keçidi animasiya ilə yerinə yetirdiyini, false isə ekranın dərhal itdiyini bildirir, məsələn, animasiyasız dismiss və ya proqram tərəfindən iyerarxiyadan silinmə zamanı.
viewWillDisappear cari ekranın aktiv olmağı dayandırdığı bütün ssenarilərdə çağırılır. iOS inkişafı üçün xarakterik olan əsas halları nəzərdən keçirək.
UINavigationController yeni kontroleri push etdikdə, cari kontrolerdə viewWillDisappear keçid animasiyasının əvvəlində çağırılır. Bu anda cari ekran onun üzərində sürüşən yeni kontrolerin altında hələ də görünür. Bu viewWillDisappear-ın animated = true ilə işə düşdüyü standart ssenaridir.
İstifadəçi geri düyməsini basdıqda və ya interaktiv geri sürüşmə etdikdə, cari kontrolerdə viewWillDisappear çağırılır. İnteraktiv jest zamanı bu çağırış ləğv edilə bilər, əgər istifadəçi fikrini dəyişib ekranı yerinə qaytararsa. Bu, vəziyyətin saxlanmasını layihələşdirərkən nəzərə alınmalı vacib bir xüsusiyyətdir.
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
saveDraftData()
NotificationCenter.default.removeObserver(self)
}
Modal pəncərə bağlanarkən viewWillDisappear bağlanan kontrolerdə dismiss animasiyasının əvvəlində çağırılır. Bu anda nəticələri delegat və ya closure vasitəsilə geri qaytarmaq olar, çünki modal pəncərəni təqdim edən kontroler hələ idarəetməni almamışdır.
UITabBarController tərk edilən tabın kontrolerində viewWillDisappear-ı istifadəçi başqa taba toxunduqdan dərhal sonra çağırır. Əgər cari tabda aktiv proseslər varsa — media oxutma, fayl yükləmə, taymer — burada onlar dayandırılır və ya pauza edilir.
viewWillDisappear resursların və vəziyyətin idarə edilməsi üzrə konkret tapşırıqları həll edir. Kod nümunələri ilə əsas ssenariləri nəzərdən keçirək.
viewWillDisappear-ın ən vacib tapşırığı — istifadəçinin cari ekranda daxil etdiyi və ya dəyişdirdiyi məlumatların saxlanmasıdır. Mesaj qaralamaları, redaktə edilmiş forma sahələri, seçilmiş parametrlər — bütün bunlar ekran itməzdən əvvəl saxlanmalıdır. Davamlılıq üçün Core Data, UserDefaults və ya fayl yaddaşından istifadə edin.
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
guard hasUnsavedChanges else { return }
draftStorage.save(currentDraft)
}
viewWillAppear və ya viewDidLoad-da abunə olduğunuz NotificationCenter, KVO və Combine publisher-lar viewWillDisappear-da ləğv edilməlidir. Əgər bunu etməsəniz, bildirişlər gizli ekrana gələcək, istifadəçinin görmədiyi UI yeniləmələrinə və ya daha pisi — artıq boşaldılmış obyektlərə müraciət səbəbindən çökmələrə səbəb olacaq.
viewDidAppear-da başladılmış UIView animasiyaları və Timer və ya DispatchSource vasitəsilə işləyən taymerlər viewWillDisappear-da dayandırılmalıdır. Gizli ekranda davam edən animasiyalar istifadəçiyə heç bir fayda vermədən GPU və batareyanı israf edir. Onları açıq şəkildə dayandırın — taymerlərdə invalidate, laylarda removeAllAnimations çağırın.
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
countdownTimer?.invalidate()
countdownTimer = nil
loadingIndicator.layer.removeAllAnimations()
}
Əgər kontroler nəticə əldə etmək üçün açılmışdırsa — element seçimi, mətn daxil etmə, əməliyyatın təsdiqi — viewWillDisappear orijinal kontrolerin hələ də yığında mövcud olduğu və məlumatları qəbul edə bildiyi son andır. deinit çağırılmamışdan əvvəl delegatı və ya closure-u çağırın.
Ekran vəziyyətinin etibarlı saxlanması iOS inkişafında ən çətin tapşırıqlardan biridir. viewWillDisappear vacib, lakin strategiyanın yeganə elementi deyil. Kompleks yanaşmanı nəzərdən keçirək.
Səviyyə 1 — viewWillDisappear-da saxlama. Qayıtdıqdan dərhal sonra əlçatan olmalı olan yüngül məlumatların sürətli saxlanması. UI vəziyyəti üçün uyğundur: sürüşdürmə mövqeyi, seçilmiş seqment, giriş sahələrindəki mətn. Problem: ləğv edilmiş interaktiv pop jestində saxlama baş verir, baxmayaraq ki, istifadəçi ekranda qalıb — məlumatlar lazımsız yerə yenidən yazılır.
Səviyyə 2 — viewDidDisappear-da saxlama. Birinci səviyyədən saxlamağı təkrarlayır, lakin yalnız ekranın gizləndiyinə zəmanət olduqdan sonra işə düşür. Bu ləğv edilmiş jestlərə qarşı sığortadır. Lakin viewWillDisappear-da artıq bildirişlərdən çıxmısınızsa, viewDidDisappear bəzi məlumatlara giriş əldə edə bilməz.
Səviyyə 3 — tətbiq bildirişləri vasitəsilə saxlama. UIApplication.willResignActiveNotification və UIApplication.didEnterBackgroundNotification tətbiqin bağlanmasını ələ keçirir. İstifadəçi tətbiqi bağlayıbsa, viewWillDisappear çağırılmamış ola bilər — lakin bu bildirişlər vasitəsilə saxlama sessiyanın bitməsində məlumatların bütövlüyünü təmin edir.
| Səviyyə | Metod/Bildiriş | Etibarlılıq | İstifadə |
|---|---|---|---|
| 1 | viewWillDisappear | Yüksək | UI vəziyyəti, qaralamalar |
| 2 | viewDidDisappear | Çox yüksək | Kritik məlumatlar |
| 3 | willResignActive | Maksimal | Bağlanma zamanı |
Tövsiyə: kritik istifadəçi məlumatları üçün hər üç səviyyənin kombinasiyasından istifadə edin. Qeyri-kritik vəziyyət üçün birinci səviyyə kifayətdir. Eyni məlumatları dəfələrlə yenidən yazmamaq vacibdir — son saxlamadan bəri məlumatların dəyişdiyini göstərən dirty flagından istifadə edin.
İstifadəçinin məlumat daxil etdiyi CRUD ekranları üçün strategiyaya xüsusi diqqət yetirilməlidir. Belə ekranlarda viewWillDisappear-da hər düymə vuruşunu saxlamaq tövsiyə edilmir — bu həddən artıqdır. Timer vasitəsilə gecikməli (debounce) avtomatik saxlamadan istifadə edin, viewWillDisappear-ı isə yalnız saxlanmamış dəyişikliklər olduqda yekun məcburi saxlama üçün tətbiq edin. Belə yanaşma performans və məlumat təhlükəsizliyi arasında tarazlıq yaradır.
Core Data olan tətbiqlər üçün əlavə tədbir viewWillDisappear-da saveContext-i yalnız idarə olunan obyekt kontekstində real dəyişikliklər olduqda çağırmaqdır. Saxlamadan əvvəl context.hasChanges yoxlanışı persistent store-a lazımsız yazmaların qarşısını alır və cihazın batareya ömrünü uzadır. Bu yoxlamanı applicationDidEnterBackground-da qlobal saxlama ilə birləşdirin.
Yanlış istifadə viewWillDisappear məlumat itkisinə, yaddaş sızmalarına və tətbiqin qeyri-sabit davranışına səbəb ola bilər. iOS tərtibatçılarının tez-tez etdiyi səhvləri nəzərdən keçirək.
Birinci səhv — məlumatları yalnız viewWillDisappear-da saxlamaq. Yuxarıda müzakirə edildiyi kimi, interaktiv pop jestində metod ekran itməsə belə çağırılır. Əgər saxlama yan təsirlərə malikdirsə — məlumatların serverə göndərilməsi, vəziyyətin dəyişdirilməsi — bu yalançı işə düşmələrə səbəb ola bilər. isBeingDismissed və ya isMovingFromParent yoxlanışını əlavə edin.
İkinci səhv — NotificationCenter-dən çıxmamaq. Bu iOS-da ən çox yayılmış yaddaş sızmalarından biridir. Əgər viewWillAppear-da UIResponder.keyboardWillShowNotification-a abunə olmusunuzsa, lakin viewWillDisappear-da çıxmamısınızsa, closure çağırılmağa davam edir. Kontrolerin deinit-ində closure boşaldılmış obyektə istinad edəcək — tətbiqin çökməsi qaçılmazdır.
Üçüncü səhv — ağır sinxron əməliyyatların yerinə yetirilməsi. viewWillDisappear-da böyük həcmli məlumatların saxlanması, Core Data-ya və ya fayl sisteminə yazma main thread-ı bloklayır. Əgər əməliyyat keçid animasiyasından uzun çəkərsə, UIKit thread-ı dayandırır və interfeys donur. Ağır saxlama əməliyyatlarını fon növbələrinə çıxarın.
Dördüncü səhv — super-i çağırmağı unutmaq. super.viewWillDisappear-ı çağırmamaq UINavigationController və UITabBarController-in işini poza bilər, çünki onlar bu metoddan daxili vəziyyətləri üçün istifadə edir. Həmişə super-i Apple sənədləşməsinə uyğun olaraq birinci və ya sonuncu çağırın.
Bu problem iOS-da aktiv çox tapşırıqlılıq və tətbiqlər arasında keçidlərlə daha da pisləşir. Beşinci səhv — viewWillDisappear-da saxlamadan sonra DispatchQueue.main.async istifadə etmək. super.viewWillDisappear-ı çağırdıqdan sonra əsas növbəyə asinxron blok göndərirsinizsə, blokun icrası zamanı kontrolerin hələ də mövcud olacağına zəmanət yoxdur. Yaddaşın boşaldılmasına və tətbiq çökməsinin qarşısını almaq üçün closure-ların daxilində həmişə zəif istinadlardan [weak self] istifadə edin.
Tez-tez verilən suallar
viewWillDisappear itmənin əvvəlində, ekran hələ görünərkən çağırılır. viewDidDisappear — ekran tamamilə gizləndikdən və animasiya bitdikdən sonra çağırılır.
Saxlamanı təsdiqləmək üçün viewDidDisappear-dan istifadə edin və ya viewWillDisappear daxilində isMovingFromParent və isBeingDismissed xüsusiyyətlərini yoxlayaraq ekranın həqiqətən itib-itməyəcəyini müəyyənləşdirin.
Bəli, mütləq, əgər self ilə bloklar və ya selektorlar istifadə edirsinizsə. ARC NotificationCenter abunəliklərini idarə etmir. iOS 9+ bloklar üçün zəif istinaddan istifadə edin və viewWillDisappear-da çıxın.
Heç bir şəkildə — force quit Lifecycle metodlarını çağırmır. Tətbiqin bitməsində zəmanətli saxlama üçün UIApplication.willTerminateNotification-dan istifadə edin və ya məlumatları dəyişdikcə real vaxtda saxlayın.
Bəli, interaktiv pop jestində UIKit viewWillDisappear-ı jestin başlanmasından dərhal sonra çağırır. İstifadəçi jesti ləğv edərsə, ekran görünən qalır, lakin metod artıq işləyib. Həmişə isMovingFromParent-i yoxlayın.
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