iOS-da viewWillDisappear — metodning mohiyati va undan qanday to'g'ri foydalanish

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

viewWillDisappear — bu UIViewController metodidir, UIKit uni ekran foydalanuvchi displeyidan yo'qola boshlashidan oldin chaqiradi. Apple Developer Documentation ga ko'ra, bu metod animated parametrini qabul qiladi va push, pop, present, dismiss hamda tab almashinuvi paytida ishga tushadi. viewWillDisappear — holatni saqlash va resurslarni to'g'ri tozalash uchun asosiy joy.

Asosiy fikrlar

  • viewWillDisappear ekranning har bir yo'qolishidan oldin chaqiriladi
  • Qoralamalar va vaqtinchalik ma'lumotlarning holatini saqlash uchun ishlatiladi
  • NotificationCenter va KVO dan chiqish — bu metodda majburiy vazifa
  • Metod bekor qilingan jest paytida chaqirilishi mumkin — ma'lumotlar viewDidDisappear da takrorlanadi
  • super.viewWillDisappear navigatsiyaning to'g'ri ishlashi uchun majburiydir

viewWillDisappear nima

viewWillDisappear — bu UIViewController metodidir, UIKit uni View ning ekrandan yo'qola boshlashidan oldin chaqiradi. Bu paytda ekran foydalanuvchiga hali ham ko'rinadi, lekin o'tish allaqachon boshlangan: NavigationController push/pop animatsiyasini boshlagan, modal oyna yopila boshlagan yoki TabBar boshqa tabga o'tishni boshlagan. Dasturchi bu metodni ekran hali ham mavjud bo'lgan, lekin yashirinishga tayyorlanayotgan operatsiyalarni bajarish uchun override qiladi.

viewDidDisappear dan farqli o'laroq, ekran yashiringandan keyin ishga tushadigan, viewWillDisappear foydalanuvchi interfeysni hali ko'rayotgan paytda ma'lumotlarni saqlash va resurslarni bo'shatish uchun oxirgi imkoniyatni ta'minlaydi. Bu UX uchun juda muhim — qoralamani saqlash yoki taymerni to'xtatish foydalanuvchi boshqa ekranga o'tishidan oldin sodir bo'lishi kerak.

Metod animated parametrini qabul qiladi, bu yo'qolish animatsiya bilan sodir bo'lishini ko'rsatadi. true qiymati UIKit o'tishni animatsiya bilan bajarishini, false — ekran bir zumda yo'qolishini bildiradi, masalan, animatsiyasiz dismiss yoki dasturiy ravishda iyerarxiyadan olib tashlash paytida.

viewWillDisappear qachon chaqiriladi

viewWillDisappear joriy ekran faol bo'lishni to'xtatgan barcha stsenariylarda chaqiriladi. iOS rivojlanishi uchun xos bo'lgan asosiy holatlarni ko'rib chiqamiz.

Yangi ekranni push qilishda

UINavigationController yangi kontrollerni push qilganda, joriy kontrollerda viewWillDisappear o'tish animatsiyasining boshida chaqiriladi. Bu paytda joriy ekran uning ustida sirpanayotgan yangi kontroller ostida hali ham ko'rinadi. Bu viewWillDisappear animated = true bilan ishga tushadigan standart stsenariy.

Joriy ekranni pop qilishda

Foydalanuvchi orqa tugmasini bosganida yoki interaktiv orqa surishni amalga oshirganida, joriy kontrollerda viewWillDisappear chaqiriladi. Interaktiv jest paytida bu chaqiruv bekor qilinishi mumkin, agar foydalanuvchi fikrini o'zgartirib, ekranni joyiga qaytarsa. Bu holatni saqlashni loyihalashda e'tiborga olinishi kerak bo'lgan muhim xususiyatdir.

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

Kontrollerni dismiss qilishda

Modal oyna yopilganda viewWillDisappear yopilayotgan kontrollerda dismiss animatsiyasining boshida chaqiriladi. Bu paytda natijalarni delegat yoki closure orqali qaytarish mumkin, chunki modal oynani taqdim etgan kontroller hali boshqaruvni olmagan.

TabBar tablarini almashtirishda

UITabBarController tark etilgan tabning kontrollerida viewWillDisappear-ni foydalanuvchi boshqa tabga tekkandan so'ng darhol chaqiradi. Agar joriy tabda faol jarayonlar bo'lsa — media ijro etish, fayl yuklash, taymer — bu yerda ular to'xtatiladi yoki pauza qilinadi.

viewWillDisappear da amaliy vazifalar

viewWillDisappear resurslar va holatni boshqarish bo'yicha aniq vazifalarni hal qiladi. Kod misollari bilan asosiy stsenariylarni ko'rib chiqamiz.

Foydalanuvchi ma'lumotlarini saqlash

viewWillDisappear ning eng muhim vazifasi — foydalanuvchining joriy ekranda kiritgan yoki o'zgartirgan ma'lumotlarini saqlash. Xabar qoralamalari, tahrirlangan forma maydonlari, tanlangan sozlamalar — bularning barchasi ekran yo'qolishidan oldin saqlanishi kerak. Barqarorlik uchun Core Data, UserDefaults yoki fayl saqlashdan foydalaning.

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

Bildirishnomalardan chiqish

viewWillAppear yoki viewDidLoad da obuna bo'lgan NotificationCenter, KVO va Combine publisher-lar viewWillDisappear da bekor qilinishi kerak. Agar buni qilmasangiz, bildirishnomalar yashirin ekranga keladi, foydalanuvchi ko'rmaydigan UI yangilanishlariga yoki undan ham yomoni — allaqachon bo'shatilgan ob'ektlarga murojaat tufayli qulashlarga olib keladi.

Animatsiyalar va taymerlarni to'xtatish

viewDidAppear da boshlangan UIView animatsiyalari va Timer yoki DispatchSource orqali ishlaydigan taymerlar viewWillDisappear da to'xtatilishi kerak. Yashirin ekranda davom etayotgan animatsiyalar foydalanuvchiga hech qanday foyda keltirmasdan GPU va batareyani isrof qiladi. Ularni aniq to'xtating — taymerlarda invalidate, qatlamlarda removeAllAnimations chaqiring.

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

Ma'lumotlarni qaytarish

Agar kontroller natija olish uchun ochilgan bo'lsa — element tanlash, matn kiritish, harakatni tasdiqlash — viewWillDisappear asl kontroller hali stekda mavjud bo'lgan va ma'lumotlarni qabul qila oladigan oxirgi paytdir. deinit chaqirilishidan oldin delegat yoki closure ni chaqiring.

Holatni saqlash strategiyasi

Ekran holatini ishonchli saqlash iOS rivojlanishidagi eng qiyin vazifalardan biridir. viewWillDisappear muhim, ammo strategiyaning yagona elementi emas. Kompleks yondashuvni ko'rib chiqamiz.

Daraja 1 — viewWillDisappear da saqlash. Qaytgandan so'ng darhol mavjud bo'lishi kerak bo'lgan engil ma'lumotlarni tez saqlash. UI holati uchun mos: aylantirish pozitsiyasi, tanlangan segment, kiritish maydonlaridagi matn. Muammo: bekor qilingan interaktiv pop jestida saqlash sodir bo'ladi, garchi foydalanuvchi ekranda qolgan bo'lsa ham — ma'lumotlar keraksiz qayta yoziladi.

Daraja 2 — viewDidDisappear da saqlash. Birinchi darajadagi saqlashni takrorlaydi, lekin faqat ekran yashiringaniga kafolat bo'lgandan keyin ishga tushadi. Bu bekor qilingan jestlarga qarshi sug'urtadir. Biroq, viewWillDisappear da bildirishnomalardan chiqqan bo'lsangiz, viewDidDisappear ba'zi ma'lumotlarga kirish imkoniga ega bo'lmasligi mumkin.

Daraja 3 — ilova bildirishnomalari orqali saqlash. UIApplication.willResignActiveNotification va UIApplication.didEnterBackgroundNotification ilovaning yig'ilishini tutib oladi. Agar foydalanuvchi ilovani yig'gan bo'lsa, viewWillDisappear chaqirilmagan bo'lishi mumkin — lekin bu bildirishnomalar orqali saqlash sessiya yakunida ma'lumotlarning butunligini kafolatlaydi.

DarajaMetod/BildirishnomaIshonchlilikFoydalanish
1viewWillDisappearYuqoriUI holati, qoralamalar
2viewDidDisappearJuda yuqoriKritik ma'lumotlar
3willResignActiveMaksimalYig'ish paytida

Tavsiya: kritik foydalanuvchi ma'lumotlari uchun uch darajaning kombinatsiyasidan foydalaning. Kritik bo'lmagan holat uchun birinchi daraja yetarli. Bir xil ma'lumotlarni bir necha marta qayta yozmaslik muhim — oxirgi saqlashdan beri ma'lumotlar o'zgarganligini ko'rsatadigan dirty flagidan foydalaning.

Foydalanuvchi ma'lumot kiritadigan CRUD ekranlari uchun strategiyaga alohida e'tibor berish kerak. Bunday ekranlarda viewWillDisappear da har bir tugma bosilishini saqlash tavsiya etilmaydi — bu ortiqcha. Timer orqali kechikishli (debounce) avtomatik saqlash dan foydalaning va viewWillDisappear ni faqat saqlanmagan o'zgarishlar mavjud bo'lganda yakuniy majburiy saqlash uchun qo'llang. Bunday yondashuv ishlash va ma'lumotlar xavfsizligi o'rtasida muvozanatni ta'minlaydi.

Core Data bo'lgan ilovalar uchun qo'shimcha chora viewWillDisappear da saveContext ni faqat boshqariladigan ob'ekt kontekstida haqiqiy o'zgarishlar mavjud bo'lganda chaqirishdir. Saqlashdan oldin context.hasChanges tekshiruvi persistent store ga keraksiz yozuvlarning oldini oladi va qurilma batareyasining ishlash muddatini uzaytiradi. Ushbu tekshiruvni applicationDidEnterBackground da global saqlash bilan birlashtiring.

viewWillDisappear da odatiy xatolar

Noto'g'ri foydalanish viewWillDisappear ma'lumot yo'qotilishiga, xotira oqishiga va ilovaning beqaror harakatiga olib kelishi mumkin. iOS dasturchilarining tez-tez uchraydigan xatolarini ko'rib chiqamiz.

Birinchi xato — ma'lumotlarni faqat viewWillDisappear da saqlash. Yuqorida muhokama qilinganidek, interaktiv pop jestida metod ekran yo'qolmasa ham chaqiriladi. Agar saqlash yon ta'sirlarga ega bo'lsa — ma'lumotlarni serverga yuborish, holatni o'zgartirish — bu soxta ishga tushishlarga olib kelishi mumkin. isBeingDismissed yoki isMovingFromParent tekshiruvini qo'shing.

Ikkinchi xato — NotificationCenter dan chiqmaslik. Bu iOS dagi eng keng tarqalgan xotira oqishlaridan biridir. Agar viewWillAppear da UIResponder.keyboardWillShowNotification ga obuna bo'lgan bo'lsangiz, lekin viewWillDisappear da chiqmagan bo'lsangiz, closure chaqirilishda davom etadi. Kontrollerning deinitida closure bo'shatilgan ob'ektga murojaat qiladi — ilovaning qulashi muqarrar.

Uchinchi xato — og'ir sinxron operatsiyalarni bajarish. viewWillDisappear da katta hajmdagi ma'lumotlarni saqlash, Core Data yoki fayl tizimiga yozish main thread ni bloklaydi. Agar operatsiya o'tish animatsiyasidan uzoq davom etsa, UIKit thread ni to'xtatadi va interfeys muzlaydi. Og'ir saqlashlarni fon navbatlariga o'tkazing.

To'rtinchi xato — super ni chaqirishni unutish. super.viewWillDisappear ni chaqirmaslik UINavigationController va UITabBarController ishini buzishi mumkin, chunki ular bu metodni ichki holatlari uchun ishlatadi. Har doim super ni Apple hujjatlariga muvofiq birinchi yoki oxirgi chaqiring.

Bu muammo iOS da faol ko'p vazifalilik va ilovalar o'rtasida almashinish bilan yanada kuchayadi. Beshinchi xato — viewWillDisappear da saqlashdan keyin DispatchQueue.main.async dan foydalanish. super.viewWillDisappear ni chaqirgandan so'ng asosiy navbatga asinxron blok yuborsangiz, blokning bajarilishi paytida kontroller hali mavjud bo'lishiga kafolat yo'q. Xotiraning bo'shatilishiga va ilova qulashining oldini olish uchun closure lar ichida har doim zaif havolalardan [weak self] foydalaning.

Tez-tez so'raladigan savollar

viewWillDisappear viewDidDisappear dan qanday farq qiladi?

viewWillDisappear yo'qolish boshida, ekran hali ko'rinayotgan paytda chaqiriladi. viewDidDisappear — ekran to'liq yashiringanidan va animatsiya tugaganidan keyin chaqiriladi.

Bekor qilingan pop jestida nima qilish kerak?

Saqlashni tasdiqlash uchun viewDidDisappear dan foydalaning yoki viewWillDisappear ichida isMovingFromParent va isBeingDismissed xususiyatlarini tekshirib, ekran haqiqatan ham yo'qolishini aniqlang.

NotificationCenter dan qo'lda chiqish kerakmi?

Ha, albatta, agar self bilan bloklar yoki selektorlardan foydalansangiz. ARC NotificationCenter obunalarini boshqarmaydi. iOS 9+ bloklar uchun zaif havoladan foydalaning va viewWillDisappear da chiqing.

viewWillDisappear orqali force quit paytida ma'lumotlarni qanday saqlash mumkin?

Hech qanday — force quit Lifecycle metodlarini chaqirmaydi. Ilova tugashida kafolatlangan saqlash uchun UIApplication.willTerminateNotification dan foydalaning yoki ma'lumotlarni o'zgarishi bilan real vaqtda saqlang.

viewWillDisappear kontroller yo'qolmasdan chaqirilishi mumkinmi?

Ha, interaktiv pop jestida UIKit viewWillDisappear ni jest boshlanishidan so'ng darhol chaqiradi. Agar foydalanuvchi jestni bekor qilsa, ekran ko'rinadigan bo'lib qoladi, lekin metod allaqachon ishga tushgan. Har doim isMovingFromParent ni tekshiring.

Xulosa

  • viewWillDisappear har bir ekran yo'qolishidan oldin chaqiriladi — push, pop, present va dismiss paytida
  • Asosiy maqsad — holatni saqlash, bildirishnomalardan chiqish va animatsiyalarni to'xtatish
  • Interaktiv jestlar paytida metod haqiqiy yashirinishsiz chaqirilishi mumkin
  • Kritik foydalanuvchi ma'lumotlari uchun uch darajali saqlash strategiyasidan foydalaning
  • viewWillDisappear da NotificationCenter dan chiqish xotira oqishining oldini oladi
  • Og'ir sinxron operatsiyalar main thread ni bloklaydi — ularni fon navbatlariga o'tkazing
  • To'g'ri navigatsiyani saqlash uchun har doim super.viewWillDisappear ni chaqiring

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