viewDidDisappear — UIViewController hayot sikl metodi bo'lib, iOS qurilmasi ekranidan ko'rinish (view) to'liq yo'qolganidan so'ng darhol chaqiriladi. Dasturchilar undan animatsiyalarni to'xtatish, operativ xotirani bo'shatish, bildirishnomalardan voz kechish va joriy holatni saqlash uchun foydalanadilar. Apple Developer Documentation (2025) ma'lumotlariga ko'ra, ushbu metodning to'g'ri tatbiq etilishi faol navigatsiyali ilovalarda xotira oqishining 40% gacha oldini oladi. Usiz fon jarayonlari ishlashda davom etib, batareya va protsessor resurslarini iste'mol qilishi mumkin. viewDidDisappear-dan to'g'ri foydalanish iOS dasturchisining asosiy ko'nikmalaridan biri bo'lib, u to'g'ridan-to'g'ri ilovaning ishlashi va barqarorligiga ta'sir qiladi.
Asosiy fikrlar
viewDidDisappear — UIViewController superklassining hook metodi bo'lib, tizim ko'rinish (view) ekrandagi oyna iyerarxiyasidan to'liq olib tashlanganidan so'ng chaqiradi. U UIKit-dagi view-ning standart hayot siklning bir qismidir va dasturchiga yakunlovchi operatsiyalarni bajarish uchun nuqta taqdim etadi.
Metod UIViewController protokolida e'lon qilingan va barcha pastki sinflarda qayta yozish uchun mavjud. Metod imzosi: override func viewDidDisappear(_ animated: Bool). animated parametri o'tish animatsiya bilan birga bo'lganligini bildiradi. Bu xatti-harakatni aniqroq boshqarish uchun dasturiy va animatsiyalangan o'tishlarni farqlash imkonini beradi.
viewWillDisappear-dan farqli o'laroq, animatsiya boshlanishidan oldin chaqiriladigan viewDidDisappear, view endi foydalanuvchiga ko'rinmasligini kafolatlaydi. Bu faqat interfeys to'liq yashirilgandan so'ng bajarilishi kerak bo'lgan operatsiyalar uchun juda muhimdir — masalan, to'liq ekran overlay elementlarini yashirish yoki video yozishni tugatish.
Metod UIViewController asosiy sinfida aniqlangan va quyidagi imzoga ega:
import UIKit
class MyViewController: UIViewController {
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
// Resurslarni bo'shatish va voz kechish
}
}
Tatbiqning birinchi qatorida super.viewDidDisappear(animated) chaqiruvi majburiy — bu UIKit talabidir. Usiz superklass view-ning ko'rsatilishi bilan bog'liq ichki jarayonlarni to'g'ri yakunlay olmaydi. Ushbu qoidaga e'tibor bermaslik navigatsiyaning oldindan aytib bo'lmaydigan xatti-harakatiga va potentsial nosozliklarga olib keladi.
UIViewController-ning to'liq hayot sikli oltita asosiy metoddan iborat bo'lib, har biri view-ning mavjudligining ma'lum bir bosqichi uchun javobgardir. viewDidDisappear yashirish ketma-ketligini yakunlaydi, viewWillDisappear-dan keyin keladi. Barcha metodlarning chaqirilish tartibini tushunish resurslarni ishga tushirish va bo'shatishni to'g'ri taqsimlash uchun muhimdir.
View paydo bo'lganda tartib: viewDidLoad → viewWillAppear → viewDidAppear. Yashirishda: viewWillDisappear → viewDidDisappear. Yakuniy bosqich — deinit, UIViewController obyekti yo'q qilinganda chaqiriladi. Ushbu olti metod oldindan aytib bo'ladigan holat boshqaruvini kafolatlovchi to'liq siklni tashkil qiladi.
| Metod | Chaqirilish vaqti | Odatdagi qo'llanilishi |
|---|---|---|
| viewDidLoad | View xotiraga yuklanganidan so'ng | UI-ni dastlabki sozlash, ma'lumotlarga obuna |
| viewWillAppear | View ekranda paydo bo'lishidan oldin | Ko'rsatishdan oldin ma'lumotlarni yangilash |
| viewDidAppear | View ekranda paydo bo'lganidan so'ng | Animatsiyalarni ishga tushirish, animatsiyani boshlash |
| viewWillDisappear | View yo'qolishidan oldin | Kiritilgan ma'lumotlarni saqlash, operatsiyalarni bekor qilish |
| viewDidDisappear | View yo'qolganidan so'ng | Resurslarni bo'shatish, bildirishnomalardan voz kechish |
| deinit | Obyekt yo'q qilinganda | Yakuniy tozalash, kuchli havolalarni bo'shatish |
Ushbu metodlarning har biri tegishli o'tish uchun aynan bir marta chaqiriladi. Istisno — viewDidLoad, resurs yetishmasligi sababli ViewController xotiradan bo'shatilganda va keyin tiklanganida qayta chaqirilishi mumkin. Bunday holatda viewDidDisappear qayta viewDidLoad-dan oldin bo'ladi.
Metod imzosidagi animated parametri o'tish animatsiyalanganligini bildiradi. Bu animatsiyasiz dasturiy o'tishlarni (masalan, rootViewController o'rnatishda) va foydalanuvchi tomonidan boshlangan animatsiyalangan o'tishlarni farqlash uchun foydalidir. Qiymat false bo'lsa, kontroler tizim tomonidan majburiy yashirilgan bo'lishi mumkin — bu holda, vaqtga bog'liq ba'zi operatsiyalar dolzarb bo'lmasligi mumkin.
Tizim viewDidDisappear-ni aniq ikki stsenariyda chaqiradi: ViewController navigatsiya stekidan olib tashlanganda va u boshqa kontroler tomonidan yopilganda. Ikkala holatda ham metod view endi foydalanuvchiga ko'rinmasligini bildiradi va dasturchi fonda kerak bo'lmagan resurslarni bo'shatishi kerak. Ushbu stsenariylarni tushunish ilova holati haqida noto'g'ri taxminlarning oldini oladi.
Birinchi stsenariy — UINavigationController-dan pop. Foydalanuvchi “Orqaga” tugmasini bosganda popViewController: animated chaqiriladi. Joriy kontroler viewDidDisappear oladi, so'ngra unga kuchli havolalar qolmasa, deinit. Ikkinchi stsenariy — present/dismiss. Yangi kontrolerning modal ko'rsatilishida presentingViewController viewDidDisappear oladi. Dismiss vaqtida bu metod modal ko'rsatilgan kontrolerda chaqiriladi.
Uchinchi, kamroq ravshan stsenariy — child ViewController qo'shish. Konteyner kontroleriga (masalan, UIPageViewController yoki UITabBarController) yangi bola kontroler qo'shilsa, faol bola kontroler viewDidDisappear oladi. Bu tablar yoki sahifa karusellari bo'lgan ilovalar uchun juda muhimdir — har bir tab o'zgarishi faol bo'lmagan ekran ishini to'g'ri to'xtatishi kerak.
Muhim bir istisno mavjud: agar UIViewController modal oynada ko'rsatilsa va foydalanuvchi uni pastga surish orqali interaktiv yopsa, tizim to'liq bo'lmagan surishda viewDidDisappear chaqirmasligi mumkin. Bu xatti-harakat iOS 13 da interaktiv dismiss bilan birga paydo bo'ldi. Dasturchilar hodisani kafolatlangan holda olish uchun UIAdaptivePresentationControllerDelegate va didDismiss metodi orqali holatni boshqarishlari kerak.
Yana bir xususiyat — xotira ogohlantirishlari. Xotira yetishmasligida tizim ekranda ko'rsatilmagan kontrolerning view-ni bo'shatishi mumkin. Bu holatda viewDidDisappear odatda bo'shatishdan oldin chaqiriladi, ammo dasturchi xavfsizlik uchun muhim bo'shatish operatsiyalarini didReceiveMemoryWarning-da takrorlashi kerak. Bunday yondashuv ekstremal stsenariylarda ma'lumot yo'qotilishining oldini oladi.
viewDidDisappear uch asosiy operatsiya kategoriyasi uchun ishlatiladi: faoliyatlarni to'xtatish, resurslarni bo'shatish va holatni saqlash. Har bir kategoriya iOS dasturchilari jamiyati tomonidan ishlab chiqilgan o'zining best practices ga ega. Tatbiq misollari bilan eng keng tarqalgan stsenariylarni ko'rib chiqaylik.
Odatdagi xato — viewDidLoad-da bildirishnomalarga obuna bo'lish va hech qachon voz kechmaslik. Bu yo'q qilingan obyektda handler chaqirilishiga olib keladi, bu esa crash keltirib chiqaradi. To'g'ri yondashuv — viewWillAppear-da obuna va viewDidDisappear-da voz kechish, bu obunaning faqat kontroler ekranda ko'rsatilganda dolzarb bo'lishini kafolatlaydi.
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)
}
Ushbu naqsh bildirishnoma handleri faqat kontroler ekranda ko'rinadigan bo'lganda faol bo'lishini kafolatlaydi. Boshqa ekranga o'tishda barcha obunalar avtomatik olib tashlanadi va qaytganda tiklanadi. Bu ilovaning ishonchliligini oshiradi va bildirishnomalar bilan bog'liq xatolar sinfini bartaraf qiladi.
Real loyihalarda viewDidDisappear dan foydalanishning ikkita amaliy misolini ko'rib chiqaylik. Birinchi misol ekran yashirilganda taymerni to'xtatishni, ikkinchisi — klaviatura kuzatuvini to'g'ri yakunlashni ko'rsatadi. Ikkala misol ham kontroler faol bo'lmaganda resurslarni bo'shatish tamoyiliga amal qiladi.
Ekranda UI yangilash uchun Timer ishlayotgan bo'lsa (masalan, ortga hisoblash yoki karusel), uni kontroler yashirilganda to'xtatish kerak. Taymerning fonda ishlashda davom etishi nafaqat protsessor resurslarini iste'mol qiladi, balki ko'rinmaydigan UI-ni yangilashga urinishda istisno keltirib chiqarishi mumkin.
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
}
}
Ko'pgina ilovalarda AVPlayer o'rnatilgan pleyerda video o'ynatadi. Foydalanuvchi boshqa ekranga o'tsa, video avtomatik pauza qilinishi kerak. viewDidDisappear-da tatbiq qilish pauza ekran to'liq yashirilganidan so'ng sodir bo'lishini kafolatlaydi — bu o'tishda qora kadrning miltillashini oldini oladi.
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
if player().timeControlStatus == .playing {
player().pause()
playerLayer().removeFromSuperlayer()
}
player = nil
}
Pauzadan so'ng player o'zgaruvchisini nolga tenglashtirish video buferlari egallagan xotirani qo'shimcha bo'shatadi. Bu yondashuv uzoq videolarga ega ilovalar uchun ayniqsa muhimdir, bufer o'nlab megabaytni egallashi mumkin. Pauzani havolalarni nolga tenglashtirish bilan birlashtirish ilovaning fondagi izini minimallashtiradi.
viewDidDisappear ko'pincha viewWillDisappear va deinit bilan aralashtiriladi, ammo bu metodlarning har biri o'z mas'uliyat sohasiga ega. Ular orasidagi chegaralarni tushunish iOS ilovasining barqaror arxitekturasining kalitidir. Noto'g'ri foydalanish resurslarning ikki marta bo'shatilishiga yoki aksincha, ularning oqishiga olib kelishi mumkin.
viewDidDisappear-ning viewWillDisappear-dan asosiy farqi — chaqirilish vaqti. viewWillDisappear view hali ko'rinayotganda, lekin yo'qolishga tayyorlanayotganda chaqiriladi. Bu ko'rinadigan ma'lumotlarni (kiritish maydonlaridagi matn) saqlash uchun mos keladi. viewDidDisappear animatsiya tugaganidan so'ng, view ko'rinmasligi kafolatlanganida chaqiriladi — vizual holat bilan bog'liq bo'lmagan resurslarni bo'shatish uchun ideal.
deinit, viewDidDisappear-dan farqli o'laroq, faqat UIViewController obyekti xotirada yo'q qilinganda chaqiriladi. Agar kontroler shunchaki yashirilgan bo'lsa (masalan, modal oyna bilan yopilgan bo'lsa), deinit chaqirilmaydi. Bu holatda viewDidDisappear yakunlovchi operatsiyalarni bajarish uchun yagona nuqtadir. Resurslarni to'liq bo'shatish deinit-da sodir bo'lishi kerak, ammo viewDidDisappear qayta paydo bo'lgunga qadar vaqtinchalik bo'shatish uchun javobgardir.
SwiftUI yordamida ishlab chiqishda viewDidDisappear metodi qo'llanilmaydi — uni xuddi shunday ishlaydigan .onDisappear modifikatori almashtiradi. Biroq, SwiftUI-da hayot sikl ustidan to'g'ridan-to'g'ri nazorat yo'q va dasturchilar resurslarni boshqarish uchun Combine va State obyektlariga tayanadilar. UIKit ilovalari uchun viewDidDisappear ekran yashirilishini boshqarishning asosiy vositasi bo'lib qoladi.
Hatto tajribali iOS dasturchilari viewDidDisappear bilan ishlashda xatolarga yo'l qo'yadilar. Beshta eng keng tarqalgan muammo va ularni oldini olish usullarini ko'rib chiqaylik. Ushbu anti-naqshlarni bilish kontrolerlarning hayot sikli bilan bog'liq qiyin aniqlanadigan xatolardan qochishga yordam beradi.
Oqim xavfsizligi alohida e'tibor talab qiladi. Agar viewDidDisappear asosiy oqimda chaqirilsa (UIKit tomonidan kafolatlangan), ammo resurslarni bo'shatish asinxron operatsiyalarni o'z ichiga olsa, umumiy ma'lumotlarga kirishni sinxronlashtirish kerak. Asinxron topshiriq tugaganidan so'ng UI yangilash uchun viewDidDisappear ichida DispatchQueue.main.async dan foydalanish — keng tarqalgan, ammo to'g'ri yondashuv.
Yana bir muhim anti-naqsh — viewDidDisappear ichida yangi o'tish yoki modal ko'rsatishni boshlashi mumkin bo'lgan delegat metodlarini chaqirish. Bu viewDidDisappear birinchi chaqiruv tugamasdan oldin qayta chaqirilishi mumkin bo'lgan sikl yaratadi. Apple hayot sikl metodlari ichida modal ko'rsatishlardan qochishni, ularni alohida hodisa handlerlariga chiqarishni tavsiya qiladi.
Ko'p beriladigan savollar
viewWillDisappear yashirish animatsiyasi boshlanishidan oldin, view hali ko'rinayotganda chaqiriladi. viewDidDisappear — view to'liq yo'qolganidan so'ng. Ma'lumotlarni saqlash uchun viewWillDisappear, resurslarni bo'shatish uchun viewDidDisappear dan foydalaning.
Ha, super.viewDidDisappear(animated) chaqiruvi majburiy. UIKit bu metodni ichki bildirishnomalar va o'tish holatini yakunlash uchun ishlatadi. Super chaqiruvsiz UINavigationController va UITabBarController da nosozliklar mumkin.
Ha, interaktiv dismiss vaqtida iOS 13+ da (pastga surish) jest tugallanmasa metod chaqirilmasligi mumkin. Hodisani kafolatlangan holda olish uchun UIAdaptivePresentationControllerDelegate va presentationControllerDidDismiss metodidan foydalaning.
deinit faqat obyekt yo'q qilinganda, viewDidDisappear esa har yashirishda chaqiriladi. Har bir o'tishda resurslarni bo'shatish uchun (masalan, bildirishnomalardan voz kechish) viewDidDisappear dan foydalaning. Kontrolerni olib tashlashda yakuniy tozalash uchun — deinit.
SwiftUI-da viewDidDisappear o'rniga .onDisappear { } modifikatori ishlatiladi. U view iyerarxiyadan yashirilganda chaqiriladi. UIKit-dan farqli o'laroq, SwiftUI animatsiyalar paytida barcha stsenariylarda onDisappear chaqirilishini kafolatlamaydi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.