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 — 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 joriy ekran faol bo'lishni to'xtatgan barcha stsenariylarda chaqiriladi. iOS rivojlanishi uchun xos bo'lgan asosiy holatlarni ko'rib chiqamiz.
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.
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.
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
saveDraftData()
NotificationCenter.default.removeObserver(self)
}
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.
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 resurslar va holatni boshqarish bo'yicha aniq vazifalarni hal qiladi. Kod misollari bilan asosiy stsenariylarni ko'rib chiqamiz.
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.
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
guard hasUnsavedChanges else { return }
draftStorage.save(currentDraft)
}
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.
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.
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
countdownTimer?.invalidate()
countdownTimer = nil
loadingIndicator.layer.removeAllAnimations()
}
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.
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.
| Daraja | Metod/Bildirishnoma | Ishonchlilik | Foydalanish |
|---|---|---|---|
| 1 | viewWillDisappear | Yuqori | UI holati, qoralamalar |
| 2 | viewDidDisappear | Juda yuqori | Kritik ma'lumotlar |
| 3 | willResignActive | Maksimal | Yig'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.
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 yo'qolish boshida, ekran hali ko'rinayotgan paytda chaqiriladi. viewDidDisappear — ekran to'liq yashiringanidan va animatsiya tugaganidan keyin chaqiriladi.
Saqlashni tasdiqlash uchun viewDidDisappear dan foydalaning yoki viewWillDisappear ichida isMovingFromParent va isBeingDismissed xususiyatlarini tekshirib, ekran haqiqatan ham yo'qolishini aniqlang.
Ha, albatta, agar self bilan bloklar yoki selektorlardan foydalansangiz. ARC NotificationCenter obunalarini boshqarmaydi. iOS 9+ bloklar uchun zaif havoladan foydalaning va viewWillDisappear da chiqing.
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.
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
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.