viewDidDisappear: metodun mahiyyəti, UIViewController həyat dövrü və nə zaman çağrılır

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

viewDidDisappear — UIViewController həyat dövrü metodudur, iOS cihazının ekranından görünüş tamamilə yox olduqdan dərhal sonra çağrılır. Tərtibatçılar onu animasiyaları dayandırmaq, operativ yaddaşı boşaltmaq, bildirişlərdən imtina etmək və cari vəziyyəti saxlamaq üçün istifadə edirlər. Apple Developer Documentation (2025) məlumatına görə, bu metodun düzgün tətbiqi aktiv naviqasiya olan tətbiqlərdə yaddaş sızmalarının 40%-ə qədərinin qarşısını alır. Olmadan fon prosesləri işləməyə davam edə bilər, batareya və prosessor resurslarını istehlak edə bilər. viewDidDisappear-ın düzgün istifadəsi iOS tərtibatçısının əsas bacarıqlarından biridir və birbaşa tətbiqin performansına və sabitliyinə təsir göstərir.

Əsas məqamlar

  • viewDidDisappear — görünüşün ekrandan yox olmasından sonra çağrılan həyat dövrünün son metodu
  • Resursların boşaldılması üçün istifadə olunur: taymerlərin dayandırılması, yükləmə göstəricilərinin gizlədilməsi
  • Sızmaların qarşısını almaq üçün NotificationCenter-dən imtina və KVO müşahidələri üçün məcburidir
  • viewWillDisappear-dan fərqi odur ki, keçid animasiyası bitdikdən sonra çağrılır
  • deinit-i əvəz etmir — deinit obyektin son məhv edilməsinə cavabdehdir

viewDidDisappear nədir?

viewDidDisappear — UIViewController super sinfinin hook metodudur, sistem onu görünüş (view) ekranda pəncərə iyerarxiyasından tamamilə silindikdən sonra çağırır. UIKit-də görünüşün standart həyat dövrünün bir hissəsidir və tərtibatçıya yekun əməliyyatları yerinə yetirmək üçün nöqtə təmin edir.

Metod UIViewController protokolunda elan edilmişdir və bütün alt siniflərdə dəyişdirilmək üçün əlçatandır. Metodun imzası: override func viewDidDisappear(_ animated: Bool). animated parametri keçidin animasiya ilə müşayiət olunub-olunmadığını göstərir. Bu, davranışı daha dəqiq idarə etmək üçün proqram və animasiyalı keçidləri fərqləndirməyə imkan verir.

viewWillDisappear-dan fərqli olaraq, animasiya başlamazdan əvvəl çağrılan viewDidDisappear, görünüşün artıq istifadəçiyə görünmədiyini təmin edir. Bu, yalnız interfeys tamamilə gizləndikdən sonra yerinə yetirilməli olan əməliyyatlar üçün kritikdir — məsələn, tam ekran overlay elementlərinin gizlədilməsi və ya video yazısının tamamlanması.

İmza və elan

Metod UIViewController əsas sinfində müəyyən edilmişdir və aşağıdakı imzaya malikdir:

swift
import UIKit

class MyViewController: UIViewController {
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        // Resursların boşaldılması və imtina
    }
}

Tətbiqin birinci sətirində super.viewDidDisappear(animated) çağırışı məcburidir — bu UIKit tələbidir. Olmadan super sinif görünüşün göstərilməsi ilə bağlı daxili prosesləri düzgün tamamlaya bilməz. Bu qaydaya məhəl qoymamaq naviqasiyanın gözlənilməz davranışına və potensial nasazlıqlara səbəb olur.

UIViewController həyat dövründə viewDidDisappear-ın yeri

UIViewController-in tam həyat dövrü altı əsas metoddan ibarətdir, hər biri görünüşün mövcudluğunun müəyyən bir mərhələsinə cavabdehdir. viewDidDisappear gizlətmə ardıcıllığını tamamlayır, viewWillDisappear-dan sonra gəlir. Resursların işə salınması və boşaldılmasını düzgün bölüşdürmək üçün bütün metodların çağırış sırasını başa düşmək vacibdir.

Görünüş görünəndə sıra: viewDidLoadviewWillAppearviewDidAppear. Gizlədərkən: viewWillDisappearviewDidDisappear. Son mərhələ — deinit, UIViewController obyekti məhv edilərkən çağrılır. Bu altı metod proqnozlaşdırıla bilən vəziyyət idarəçiliyini təmin edən tam bir dövr təşkil edir.

MetodÇağırış anıTipik tətbiq
viewDidLoadGörünüş yaddaşa yükləndikdən sonraUI-nin ilkin qurulması, məlumatlara abunə
viewWillAppearGörünüş ekranda görünməzdən əvvəlGöstərməzdən əvvəl məlumatların yenilənməsi
viewDidAppearGörünüş ekranda göründükdən sonraAnimasiyaların işə salınması, animasiyaya başlama
viewWillDisappearGörünüş yox olmazdan əvvəlDaxil edilən məlumatların saxlanması, əməliyyatların ləğvi
viewDidDisappearGörünüş yox olduqdan sonraResursların boşaldılması, bildirişlərdən imtina
deinitObyekt məhv edilərkənSon təmizləmə, güclü istinadların boşaldılması

Bu metodların hər biri müvafiq keçid üçün dəqiq bir dəfə çağrılır. İstisna viewDidLoad-dur, resurs çatışmazlığı zamanı ViewController yaddaşdan boşaldılıb sonra bərpa edildikdə təkrar çağrıla bilər. Bu halda viewDidDisappear təkrar viewDidLoad-dan əvvəl olacaq.

Keçid animasiyası ilə əlaqə

Metod imzasındakı animated parametri keçidin animasiyalı olub-olmadığını bildirir. Bu, animasiyasız proqram keçidlərini (məsələn, rootViewController təyin edərkən) və istifadəçi tərəfindən başladılan animasiyalı keçidləri fərqləndirmək üçün faydalıdır. Dəyər false olarsa, kontroler sistem tərəfindən məcburi gizlədilə bilər — bu halda vaxtdan asılı bəzi əməliyyatlar aktual olmaya bilər.

viewDidDisappear nə zaman çağrılır

Sistem viewDidDisappear-ı dəqiq iki ssenaridə çağırır: ViewController naviqasiya yığınından silindikdə və başqa kontroler tərəfindən örtüldükdə. Hər iki halda metod görünüşün artıq istifadəçiyə görünmədiyini bildirir və tərtibatçı fonda lazım olmayan resursları boşaltmalıdır. Bu ssenariləri başa düşmək tətbiqin vəziyyəti haqqında səhv fərziyyələrin qarşısını alır.

Birinci ssenari — UINavigationController-dan pop. İstifadəçi “Geri” düyməsini basdıqda popViewController: animated çağrılır. Cari kontroler viewDidDisappear alır, sonra isə ona daha güclü istinadlar yoxdursa, deinit. İkinci ssenari — present/dismiss. Yeni kontrolerin modal göstərilməsi zamanı presentingViewController viewDidDisappear alır. Dismiss zamanı bu metod modal göstərilmiş kontrolerdə çağrılır.

Üçüncü, daha az aydın ssenari — child ViewController əlavə edilməsi. Konteyner kontrolerinə (məsələn, UIPageViewController və ya UITabBarController) yeni uşaq kontroler əlavə edilərsə, aktiv uşaq kontroler viewDidDisappear alır. Bu, tablar və ya səhifə karuselləri olan tətbiqlər üçün kritikdir — hər tab dəyişməsi aktiv olmayan ekranın işini düzgün dayandırmalıdır.

İstisnalar və qeyri-adi hallar

Vacib bir istisna var: əgər UIViewController modal pəncərədə göstərilirsə və istifadəçi onu interaktiv olaraq aşağı sürüşdürərək bağlayırsa, sistem natamam sürüşdürmədə viewDidDisappear çağırmaya bilər. Bu davranış iOS 13-də interaktiv dismiss ilə birlikdə ortaya çıxdı. Tərtibatçılar hadisənin alınmasını təmin etmək üçün UIAdaptivePresentationControllerDelegate və didDismiss metodu vasitəsilə vəziyyəti idarə etməlidirlər.

Digər bir xüsusiyyət — yaddaş xəbərdarlıqları. Yaddaş çatışmazlığı zamanı sistem ekranda göstərilməyən kontrolerin görünüşünü boşalda bilər. Bu halda viewDidDisappear adətən boşalmadan əvvəl çağrılır, lakin tərtibatçı ehtiyat üçün kritik vacib boşaltma əməliyyatlarını didReceiveMemoryWarning-da təkrarlamalıdır. Bu yanaşma ekstremal ssenarilərdə məlumat itkisinin qarşısını alır.

Tipik istifadə ssenariləri

viewDidDisappear üç əsas əməliyyat kateqoriyası üçün istifadə olunur: fəaliyyətlərin dayandırılması, resursların boşaldılması və vəziyyətin saxlanması. Hər kateqoriyanın iOS tərtibatçıları icması tərəfindən işlənmiş best practices var. Tətbiq nümunələri ilə ən çox yayılmış ssenariləri nəzərdən keçirək.

  • Animasiyaların dayandırılması — CALayer üçün layer.removeAllAnimations() çağırışı, UIView.animate bloklarının dayandırılması
  • Resursların boşaldılması — böyük şəkillərin sıfırlanması, keşlənmiş məlumatların təmizlənməsi, fayl deskriptorlarının bağlanması
  • Bildirişlərdən imtina — NotificationCenter.default-dan müşahidəçilərin silinməsi, KVO müşahidələrinin dayandırılması
  • Proqresin saxlanması — redaktə ekranı bağlanarkən qaralamaların CoreData və ya UserDefaults-a yazılması
  • Overlay-in gizlədilməsi — keçiddən sonra qalmamalı olan yükləmə göstəricilərinin, ipuclarının və popover elementlərinin silinməsi

Nümunə: NotificationCenter-dən imtina

Tipik səhv — viewDidLoad-da bildirişlərə abunə olmaq və heç vaxt imtina etməmək. Bu, məhv edilmiş obyektdə handler-in çağrılmasına səbəb olur və crash yaradır. Düzgün yanaşma — viewWillAppear-da abunə və viewDidDisappear-da imtina, bu, abunəliyin yalnız kontroler ekranda göstərilərkən aktual olmasını təmin edir.

swift
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    NotificationCenter.default.addObserver(
        self,
        selector: #selector(handleKeyboardShow),
        name: UIResponder.keyboardWillShowNotification,
        object: nil
    )
}

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

Bu nümunə bildiriş handler-inin yalnız kontroler ekranda görünəndə aktiv olmasını təmin edir. Başqa ekrana keçid zamanı bütün abunəliklər avtomatik silinir, qayıtdıqda isə bərpa olunur. Bu, tətbiqin etibarlılığını artırır və bildirişlərlə bağlı səhvlər sinfini aradan qaldırır.

Swift-də kod nümunələri

Real layihələrdə viewDidDisappear istifadəsinin iki praktik nümunəsini nəzərdən keçirək. Birinci nümunə ekran gizlədilərkən taymerin dayandırılmasını, ikincisi — klaviatura müşahidəsinin düzgün tamamlanmasını göstərir. Hər iki nümunə kontroler qeyri-aktiv olduqda resursların boşaldılması prinsipinə əməl edir.

Taymerin dayandırılması

Ekranda UI yeniləmək üçün Timer işləyirsə (məsələn, geri sayım və ya karusel), onu kontroler gizlədilərkən dayandırmaq lazımdır. Taymerin fonda işləməyə davam etməsi təkcə prosessor resurslarını istehlak etmir, həm də görünməyən UI yeniləməyə cəhd edərkən istisna yarada bilər.

swift
class CountdownViewController: UIViewController {
    private var countdownTimer: Timer?
    private var remainingSeconds: Int = 60

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        startTimer()
    }

    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        invalidateTimer()
    }

    private func invalidateTimer() {
        countdownTimer()?.invalidate()
        countdownTimer = nil
    }
}

Gizlədilərkən videonun pauzalanması

Bir çox tətbiqdə AVPlayer daxili pleyerdə video oynadır. İstifadəçi başqa ekrana keçərsə, video avtomatik pauzalanmalıdır. viewDidDisappear-da tətbiq pauzanın ekran tam gizləndikdən sonra baş verməsini təmin edir — bu, keçid zamanı qara kadrın yanıb-sönməsinin qarşısını alır.

swift
override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
    if player().timeControlStatus == .playing {
        player().pause()
        playerLayer().removeFromSuperlayer()
    }
    player = nil
}

Pauzadan sonra player dəyişəninin sıfırlanması video buferlərinin tutduğu yaddaşı əlavə olaraq boşaldır. Bu yanaşma uzun videoları olan tətbiqlər üçün xüsusilə vacibdir, bufer onlarla meqabayt tuta bilər. Pauzanın istinadların sıfırlanması ilə birləşməsi tətbiqin fonda footprintini minimuma endirir.

viewDidDisappear və digər həyat dövrü metodları

viewDidDisappear tez-tez viewWillDisappear və deinit ilə qarışdırılır, lakin bu metodların hər birinin öz məsuliyyət zonası var. Onlar arasındakı sərhədləri başa düşmək iOS tətbiqinin sabit arxitekturasının açarıdır. Yanlış istifadə resursların ikiqat boşaldılmasına və ya əksinə, onların sızmasına səbəb ola bilər.

viewDidDisappear-ın viewWillDisappear-dan əsas fərqi — çağırış anıdır. viewWillDisappear görünüş hələ görünəndə, lakin artıq yox olmağa hazırlaşanda çağrılır. Bu, görünən məlumatları (daxiletmə sahələrindəki mətn) saxlamaq üçün uyğundur. viewDidDisappear animasiya bitdikdən sonra, görünüşün görünmədiyi təmin edildikdə çağrılır — vizual vəziyyətlə əlaqəli olmayan resursları boşaltmaq üçün idealdır.

deinit, viewDidDisappear-dan fərqli olaraq, yalnız UIViewController obyekti yaddaşda məhv edilərkən çağrılır. Kontroler sadəcə gizlədilibsə (məsələn, modal pəncərə ilə örtülübsə), deinit çağrılmır. Bu vəziyyətdə viewDidDisappear yekun əməliyyatları yerinə yetirmək üçün yeganə nöqtədir. Resursların tam boşaldılması deinit-də baş verməlidir, lakin viewDidDisappear təkrar görünənə qədər müvəqqəti boşalmaya cavabdehdir.

Hansı metodu nə zaman istifadə etməli

  • viewWillDisappear — daxil edilən məlumatların saxlanması, keçidin başlanması haqqında analitikanın göndərilməsi
  • viewDidDisappear — animasiyaların dayandırılması, bildirişlərdən imtina, overlay elementlərinin gizlədilməsi
  • deinit — böyük resursların son boşaldılması, şəbəkə bağlantılarının bağlanması

SwiftUI istifadə edərək inkişafda viewDidDisappear metodu tətbiq edilmir — onu oxşar şəkildə işləyən .onDisappear dəyişdiricisi əvəz edir. Lakin SwiftUI-də həyat dövrü üzərində birbaşa nəzarət yoxdur və tərtibatçılar resursları idarə etmək üçün Combine və State obyektlərinə etibar edirlər. UIKit tətbiqləri üçün viewDidDisappear ekranın gizlədilməsini idarə etmək üçün əsas vasitə olaraq qalır.

Tətbiqdə tipik səhvlər

Hətta təcrübəli iOS tərtibatçıları viewDidDisappear ilə işləyərkən səhvlərə yol verirlər. Beş ən çox yayılmış problemi və onların qarşısını almaq yollarını nəzərdən keçirək. Bu anti-nümunələri bilmək kontrolerlərin həyat dövrü ilə bağlı çətin aşkar edilən səhvlərdən qaçmağa kömək edəcək.

  • super.viewDidDisappear-ın buraxılması — super çağırışı UIKit-in düzgün işləməsi üçün məcburidir, olmaması kontrolerin daxili vəziyyətinin pozulmasına səbəb ola bilər
  • viewDidDisappear-da ağır əməliyyatlar — viewDidDisappear-da böyük məlumatların sinxron yazılması əsas axını bloklayır və keçid animasiyasını pisləşdirir
  • Bildirişlərdən imtinanın unudulması — viewDidDisappear-da removeObserver çağırılmazsa, handler zombie-obyektdə işə düşərək EXC_BAD_ACCESS yarada bilər
  • İkiqat imtina — artıq başqa yerdə silinmiş müşahidəçinin silinməsi NSInternalInconsistencyException istisnasına səbəb olur
  • Çağırış sırasından asılılıq — iç-içə konteynerlərdə uşaq və valideyn kontrolerlərdə viewDidDisappear çağırış sırası təmin edilmir

Axın təhlükəsizliyi xüsusi diqqət tələb edir. viewDidDisappear əsas axında çağrılırsa (UIKit tərəfindən təmin edilir), lakin resursların boşaldılması asinxron əməliyyatları əhatə edirsə, paylaşılan məlumatlara girişi sinxronlaşdırmaq lazımdır. Asinxron tapşırıq tamamlandıqdan sonra UI yeniləmək üçün viewDidDisappear daxilində DispatchQueue.main.async istifadəsi geniş yayılmış, lakin düzgün yanaşmadır.

Digər vacib anti-nümunə — viewDidDisappear daxilində yeni keçid və ya modal göstərməyə başlaya bilən delegat metodlarının çağrılması. Bu, viewDidDisappear-ın ilk çağırış tamamlanmazdan əvvəl təkrar çağrıla biləcəyi bir dövr yaradır. Apple, həyat dövrü metodları daxilində modal göstərmələrdən qaçınmağı, onları ayrı hadisə handlerlərinə çıxarmağı tövsiyə edir.

Tez-tez verilən suallar

viewDidDisappear viewWillDisappear-dan nə ilə fərqlənir?

viewWillDisappear gizlətmə animasiyası başlamazdan əvvəl, görünüş hələ görünərkən çağrılır. viewDidDisappear — görünüş tamamilə yox olduqdan sonra. Məlumatları saxlamaq üçün viewWillDisappear, resursları boşaltmaq üçün viewDidDisappear istifadə edin.

super.viewDidDisappear çağırmaq lazımdırmı?

Bəli, super.viewDidDisappear(animated) çağırışı məcburidir. UIKit bu metodu daxili bildirişlər və keçid vəziyyətini tamamlamaq üçün istifadə edir. Super çağırışı olmadan UINavigationController və UITabBarController-də nasazlıqlar mümkündür.

viewDidDisappear çağrılmaya bilərmi?

Bəli, interaktiv dismiss zamanı iOS 13+-da (aşağı sürüşdürmə) jest tamamlanmadıqda metod çağrılmayabilər. Hadisənin alınmasını təmin etmək üçün UIAdaptivePresentationControllerDelegate və presentationControllerDidDismiss metodundan istifadə edin.

Hansı daha yaxşıdır: viewDidDisappear yoxsa deinit?

deinit yalnız obyekt məhv edilərkən, viewDidDisappear isə hər gizlətmədə çağrılır. Hər keçiddə resursları boşaltmaq üçün (məsələn, bildirişlərdən imtina) viewDidDisappear istifadə edin. Kontroler silinərkən son təmizləmə üçün — deinit.

SwiftUI-də viewDidDisappear necə işləyir?

SwiftUI-də viewDidDisappear əvəzinə .onDisappear { } dəyişdiricisi istifadə olunur. O, görünüş iyerarxiyadan gizlədilərkən çağrılır. UIKit-dən fərqli olaraq, SwiftUI animasiyalar zamanı bütün ssenarilərdə onDisappear çağırışına zəmanət vermir.

Nəticə

  • viewDidDisappear — gizlətmədən əvvəl həyat dövrünün son metodu, keçid animasiyası bitdikdən sonra çağrılır
  • Əsas təyinat — resursların boşaldılması, taymerlərin dayandırılması və bildirişlərdən imtina
  • UIKit-in düzgün işləməsi üçün super.viewDidDisappear çağırışı məcburidir
  • viewWillDisappear-dan çağırış anı ilə fərqlənir: animasiyadan sonra, əvvəl yox
  • deinit-i əvəz etmir — deinit obyekt məhv edilərkən çağrılır, viewDidDisappear hər gizlətmədə
  • Ağır sinxron əməliyyatlar üçün istifadə edilmir — onlar əsas axını bloklayır və animasiyanı pozur
  • iOS 13+-da zəmanətli çağırış üçün UIAdaptivePresentationControllerDelegate vasitəsilə əlavə emal tələb olunur

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