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 — 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ı.
Metod UIViewController əsas sinfində müəyyən edilmişdir və aşağıdakı imzaya malikdir:
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-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: viewDidLoad → viewWillAppear → viewDidAppear. Gizlədərkən: viewWillDisappear → viewDidDisappear. 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 |
|---|---|---|
| viewDidLoad | Görünüş yaddaşa yükləndikdən sonra | UI-nin ilkin qurulması, məlumatlara abunə |
| viewWillAppear | Görünüş ekranda görünməzdən əvvəl | Göstərməzdən əvvəl məlumatların yenilənməsi |
| viewDidAppear | Görünüş ekranda göründükdən sonra | Animasiyaların işə salınması, animasiyaya başlama |
| viewWillDisappear | Görünüş yox olmazdan əvvəl | Daxil edilən məlumatların saxlanması, əməliyyatların ləğvi |
| viewDidDisappear | Görünüş yox olduqdan sonra | Resursların boşaldılması, bildirişlərdən imtina |
| deinit | Obyekt məhv edilərkən | Son 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.
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.
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.
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.
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.
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.
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.
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.
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.
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
}
}
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.
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 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.
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.
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.
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
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.
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.
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.
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 ə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ə
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