iOS-da viewWillDisappear — metodun mahiyyəti və düzgün istifadəsi

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

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 ekranın hər itməsindən əvvəl çağırılır
  • Qaralamaların və müvəqqəti məlumatların vəziyyətini saxlamaq üçün istifadə olunur
  • NotificationCenter və KVO-dan çıxmaq — bu metodda məcburi tapşırıqdır
  • Metod ləğv edilmiş jest zamanı çağırıla bilər — məlumatlar viewDidDisappear-da təkrarlanır
  • super.viewWillDisappear naviqasiyanın düzgün işləməsi üçün məcburidir

viewWillDisappear nədir

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 nə zaman çağırılır

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.

Yeni ekranın push edilməsi zamanı

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.

Cari ekranın pop edilməsi zamanı

İ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.

swift
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    saveDraftData()
    NotificationCenter.default.removeObserver(self)
}

Kontrolerin dismiss edilməsi zamanı

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.

TabBar tablarının dəyişdirilməsi zamanı

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-da praktiki tapşırıqlar

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.

İstifadəçi məlumatlarının saxlanması

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.

swift
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    guard hasUnsavedChanges else { return }
    draftStorage.save(currentDraft)
}

Bildirişlərdən çıxma

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.

Animasiyaların və taymerlərin dayandırılması

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.

swift
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    countdownTimer?.invalidate()
    countdownTimer = nil
    loadingIndicator.layer.removeAllAnimations()
}

Məlumatların geri qaytarılması

Ə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.

Vəziyyətin saxlanması strategiyası

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ə
1viewWillDisappearYüksəkUI vəziyyəti, qaralamalar
2viewDidDisappearÇox yüksəkKritik məlumatlar
3willResignActiveMaksimalBağ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.

viewWillDisappear-da tipik səhvlər

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 viewDidDisappear-dan nə ilə fərqlənir?

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.

Ləğv edilmiş pop jestində nə etməli?

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.

NotificationCenter-dən əl ilə çıxmaq lazımdırmı?

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.

viewWillDisappear vasitəsilə force quit zamanı məlumatları necə saxlamaq olar?

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.

viewWillDisappear kontroler itmədən çağırıla bilərmi?

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ə

  • viewWillDisappear hər ekran itməsindən əvvəl çağırılır — push, pop, present və dismiss zamanı
  • Əsas məqsəd — vəziyyətin saxlanması, bildirişlərdən çıxma və animasiyaların dayandırılması
  • İnteraktiv jestlər zamanı metod həqiqi gizlənmə olmadan çağırıla bilər
  • Kritik istifadəçi məlumatları üçün üç səviyyəli saxlama strategiyasından istifadə edin
  • viewWillDisappear-da NotificationCenter-dən çıxma yaddaş sızmalarının qarşısını alır
  • Ağır sinxron əməliyyatlar main thread-ı bloklayır — onları fon növbələrinə çıxarın
  • Düzgün naviqasiyanı qorumaq üçün həmişə super.viewWillDisappear-ı çağırın

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