viewDidDisappear: metodning mohiyati, UIViewController hayot sikli va qachon chaqiriladi

Muallif: IT Sectr Nashr etilgan: 2026-03-05 O'qish vaqti: 9 daq

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 — hayot siklning yakuniy metodi, view ekrandan yo'qolganidan so'ng chaqiriladi
  • Resurslarni bo'shatish uchun ishlatiladi: taymerlarni to'xtatish, yuklash ko'rsatkichlarini yashirish
  • Xotira oqishining oldini olish uchun NotificationCenter-dan voz kechish va KVO kuzatuvlari uchun majburiy
  • viewWillDisappear-dan farqi shundaki, u o'tish animatsiyasi tugaganidan so'ng chaqiriladi
  • deinit o'rnini bosmaydi — deinit obyektni yakuniy yo'q qilish uchun javobgar

viewDidDisappear nima?

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.

Imzo va e'lon

Metod UIViewController asosiy sinfida aniqlangan va quyidagi imzoga ega:

swift
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 hayot siklida viewDidDisappear o'rni

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: viewDidLoadviewWillAppearviewDidAppear. Yashirishda: viewWillDisappearviewDidDisappear. Yakuniy bosqich — deinit, UIViewController obyekti yo'q qilinganda chaqiriladi. Ushbu olti metod oldindan aytib bo'ladigan holat boshqaruvini kafolatlovchi to'liq siklni tashkil qiladi.

MetodChaqirilish vaqtiOdatdagi qo'llanilishi
viewDidLoadView xotiraga yuklanganidan so'ngUI-ni dastlabki sozlash, ma'lumotlarga obuna
viewWillAppearView ekranda paydo bo'lishidan oldinKo'rsatishdan oldin ma'lumotlarni yangilash
viewDidAppearView ekranda paydo bo'lganidan so'ngAnimatsiyalarni ishga tushirish, animatsiyani boshlash
viewWillDisappearView yo'qolishidan oldinKiritilgan ma'lumotlarni saqlash, operatsiyalarni bekor qilish
viewDidDisappearView yo'qolganidan so'ngResurslarni bo'shatish, bildirishnomalardan voz kechish
deinitObyekt yo'q qilingandaYakuniy 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.

O'tish animatsiyasi bilan bog'liqlik

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.

viewDidDisappear qachon chaqiriladi

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.

Istisnolar va noaniq holatlar

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.

Odatda foydalanish stsenariylari

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.

  • Animatsiyalarni to'xtatish — CALayer uchun layer.removeAllAnimations() chaqiruvi, UIView.animate bloklarini to'xtatish
  • Resurslarni bo'shatish — katta rasmlarni nolga tenglashtirish, kesh ma'lumotlarini tiklash, fayl deskriptorlarini yopish
  • Bildirishnomalardan voz kechish — NotificationCenter.default dan kuzatuvchilarni olib tashlash, KVO kuzatuvlarini to'xtatish
  • Jarayonni saqlash — tahrirlash ekrani yopilganda qoralamalarni CoreData yoki UserDefaults ga yozish
  • Overlay-ni yashirish — o'tishdan so'ng qolmasligi kerak bo'lgan yuklash ko'rsatkichlari, maslahatlar va popover elementlarini olib tashlash

Misol: NotificationCenter-dan voz kechish

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.

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)
}

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.

Swift-da kod misollari

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.

Taymerni to'xtatish

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.

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
    }
}

Yashirilganda videoni pauza qilish

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.

swift
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 va boshqa hayot sikl metodlari

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.

Qaysi metodni qachon ishlatish kerak

  • viewWillDisappear — kiritilgan ma'lumotlarni saqlash, o'tish boshlanishi haqida analitika yuborish
  • viewDidDisappear — animatsiyalarni to'xtatish, bildirishnomalardan voz kechish, overlay elementlarini yashirish
  • deinit — katta resurslarni yakuniy bo'shatish, tarmoq ulanishlarini yopish

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.

Tatbiqda odatiy xatolar

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.

  • super.viewDidDisappear-ni o'tkazib yuborish — super chaqiruvi UIKit to'g'ri ishlashi uchun majburiy, uning yo'qligi kontrolerning ichki holatini buzishi mumkin
  • viewDidDisappear-da og'ir operatsiyalar — viewDidDisappear-da katta ma'lumotlarning sinxron yozilishi asosiy oqimni bloklaydi va o'tish animatsiyasini yomonlashtiradi
  • Bildirishnomalardan voz kechish unutilgan — viewDidDisappear-da removeObserver chaqirilmasa, handler zombie-obyektda ishga tushib, EXC_BAD_ACCESS keltirib chiqarishi mumkin
  • Ikki marta voz kechish — boshqa joyda allaqachon olib tashlangan kuzatuvchini olib tashlash NSInternalInconsistencyException istisnosiga olib keladi
  • Chaqirilish tartibiga bog'liqlik — ichma-ich konteynerlarda bola va ota-ona kontrolerlarda viewDidDisappear chaqirilish tartibi kafolatlanmagan

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

viewDidDisappear viewWillDisappear-dan nima bilan farq qiladi?

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.

super.viewDidDisappear chaqirish kerakmi?

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.

viewDidDisappear chaqirilmasligi mumkinmi?

Ha, interaktiv dismiss vaqtida iOS 13+ da (pastga surish) jest tugallanmasa metod chaqirilmasligi mumkin. Hodisani kafolatlangan holda olish uchun UIAdaptivePresentationControllerDelegate va presentationControllerDidDismiss metodidan foydalaning.

Qaysi biri yaxshiroq: viewDidDisappear yoki deinit?

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 qanday ishlaydi?

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

  • viewDidDisappear — yashirishdan oldin hayot siklning oxirgi metodi, o'tish animatsiyasi tugaganidan so'ng chaqiriladi
  • Asosiy maqsad — resurslarni bo'shatish, taymerlarni to'xtatish va bildirishnomalardan voz kechish
  • UIKit to'g'ri ishlashi uchun super.viewDidDisappear chaqiruvi majburiy
  • viewWillDisappear-dan chaqirilish vaqti bilan farqlanadi: animatsiyadan so'ng, avval emas
  • deinit o'rnini bosmaydi — deinit obyekt yo'q qilinganda chaqiriladi, viewDidDisappear har yashirishda
  • Og'ir sinxron operatsiyalar uchun ishlatilmaydi — ular asosiy oqimni bloklaydi va animatsiyani buzadi
  • iOS 13+ da kafolatlangan chaqirish uchun UIAdaptivePresentationControllerDelegate orqali qo'shimcha ishlov berish talab etiladi

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.

Loyihani muhokama qilish

Shuningdek o'qing