viewWillDisappear, UIKit'in ekran kullanıcının görüntüsünden kaybolmaya başlamadan hemen önce çağırdığı bir UIViewController metodudur. Apple Developer Documentation'a göre, bu metod animated parametresini alır ve push, pop, present, dismiss ve sekme değiştirmede tetiklenir. viewWillDisappear, durumu kaydetmek ve kaynakları doğru şekilde temizlemek için ana yerdir.
Önemli Noktalar
viewWillDisappear, UIKit'in denetleyicinin Görünümü ekrandan kaybolmaya başlamadan hemen önce çağırdığı bir UIViewController metodudur. Bu anda ekran kullanıcı için hala görünür durumdadır, ancak geçiş zaten başlatılmıştır: NavigationController push/pop animasyonunu başlatmış, modal görünüm kapanmaya başlamış veya TabBar başka bir sekmeye geçiş yapmaya başlamıştır. Geliştirici, ekranın hala erişilebilir olmasını gerektiren ancak gizlenmeye hazırlanan işlemleri gerçekleştirmek için bu metodu geçersiz kılar.
Ekran gizlendikten sonra tetiklenen viewDidDisappear'ın aksine, viewWillDisappear, kullanıcı arayüzü hala görebilirken verileri kaydetmek ve kaynakları serbest bırakmak için son fırsatı sağlar. Bu, UX için son derece önemlidir — bir taslağı kaydetmek veya bir zamanlayıcıyı durdurmak, kullanıcı başka bir ekrana geçmeden önce gerçekleşmelidir.
Metod, kaybolmanın animasyonlu olup olmadığını belirten animated parametresini kabul eder. true, UIKit'in animasyonlu bir geçiş yaptığı anlamına gelir, false ise ekranın anında kaybolduğu anlamına gelir; örneğin animasyonsuz dismiss veya programatik olarak hiyerarşiden kaldırma sırasında.
viewWillDisappear, mevcut ekranın artık aktif olmadığı tüm senaryolarda çağrılır. iOS geliştirmeye özgü ana durumları inceleyelim.
UINavigationController yeni bir denetleyiciyi push ettiğinde, geçiş animasyonunun başlangıcında mevcut denetleyicide viewWillDisappear çağrılır. Bu anda mevcut ekran, üzerinde kayan yeni denetleyicinin altında hala görünür durumdadır. Bu, viewWillDisappear'ın animated = true ile tetiklendiği standart senaryodur.
Kullanıcı geri düğmesine bastığında veya etkileşimli bir geri kaydırma hareketi yaptığında, mevcut denetleyicide viewWillDisappear çağrılır. Etkileşimli bir jest ile, kullanıcı fikrini değiştirip ekranı yerine geri getirirse bu çağrı iptal edilebilir. Durum kaydetme tasarlanırken dikkate alınması gereken önemli bir özelliktir.
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
saveDraftData()
NotificationCenter.default.removeObserver(self)
}
Bir modal görünüm kapatılırken, dismiss animasyonunun başlangıcında kapanan denetleyicide viewWillDisappear çağrılır. Bu noktada, sonuçları bir delege veya closure aracılığıyla geri gönderebilirsiniz, çünkü modalı sunan denetleyici henüz kontrolü geri almamıştır.
UITabBarController, kullanıcı başka bir sekmeye dokunduktan hemen sonra terk edilen sekmelerin denetleyicisinde viewWillDisappear'ı çağırır. Mevcut sekmede aktif işlemler varsa — medya oynatma, dosya indirme, zamanlayıcı — bunlar burada duraklatılmalı veya durdurulmalıdır.
viewWillDisappear, kaynak ve durum yönetimiyle ilgili belirli görevleri çözer. Kod örnekleriyle ana senaryoları inceleyelim.
viewWillDisappear'ın en önemli görevi, kullanıcının mevcut ekranda girdiği veya değiştirdiği verileri kaydetmektir. Mesaj taslakları, düzenlenmiş form alanları, seçilen ayarlar — tüm bunlar ekran kaybolmadan önce kaydedilmelidir. Kalıcılık için Core Data, UserDefaults veya dosya depolama kullanın.
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
guard hasUnsavedChanges else { return }
draftStorage.save(currentDraft)
}
viewWillAppear veya viewDidLoad'da abone olduğunuz NotificationCenter, KVO ve Combine yayıncıları viewWillDisappear'da iptal edilmelidir. Aksi takdirde, bildirimler gizli ekrana gelir ve kullanıcının görmediği UI güncellemelerine veya — daha kötüsü — zaten ayrılmış nesnelere erişim nedeniyle çökmelere neden olur.
viewDidAppear'da başlatılan UIView animasyonları ve Timer veya DispatchSource aracılığıyla çalışan zamanlayıcılar viewWillDisappear'da durdurulmalıdır. Gizli bir ekranda devam eden animasyonlar, kullanıcı için hiçbir fayda sağlamadan GPU ve pil tüketir. Zamanlayıcılarda invalidate ve katmanlarda removeAllAnimations çağırarak bunları açıkça durdurun.
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
countdownTimer?.invalidate()
countdownTimer = nil
loadingIndicator.layer.removeAllAnimations()
}
Bir denetleyici bir sonuç almak için açılmışsa — bir öğe seçme, metin girme, bir eylemi onaylama — viewWillDisappear, orijinal denetleyicinin yığında hala var olduğu ve veri alabildiği son andır. deinit çağrılmadan önce delegeyi veya closure'ı çağırın.
Güvenilir durum kaydetme, iOS geliştirmedeki en zorlu görevlerden biridir. viewWillDisappear, stratejinin önemli ancak tek öğesi değildir. Kapsamlı bir yaklaşıma bakalım.
Seviye 1 — viewWillDisappear'da kaydetme. Geri dönüşte hemen kullanılabilir olması gereken hafif verilerin hızlı kaydedilmesi. UI durumu için uygundur: kaydırma konumu, seçili bölüm, giriş alanlarındaki metin. Sorun: iptal edilen etkileşimli pop jestinde, kullanıcı ekranda kalmış olsa bile kaydetme gerçekleşir — veriler gereksiz yere üzerine yazılır.
Seviye 2 — viewDidDisappear'da kaydetme. Birinci seviyedeki kaydetmeyi çoğaltır ancak yalnızca ekranın garantili olarak gizlenmesinden sonra tetiklenir. Bu, iptal edilen jestlere karşı bir korumadır. Ancak, viewWillDisappear'da bildirimlerden zaten aboneliği iptal ettiyseniz, viewDidDisappear bazı verilere erişemeyebilir.
Seviye 3 — uygulama bildirimleri aracılığıyla kaydetme. UIApplication.willResignActiveNotification ve UIApplication.didEnterBackgroundNotification, uygulamanın arka plana alınmasını yakalar. Kullanıcı uygulamayı küçülttüyse, viewWillDisappear çağrılmamış olabilir — ancak bu bildirimler aracılığıyla kaydetme, oturum sonunda veri bütünlüğünü garanti eder.
| Seviye | Metod/Bildirim | Güvenilirlik | Kullanım |
|---|---|---|---|
| 1 | viewWillDisappear | Yüksek | UI durumu, taslaklar |
| 2 | viewDidDisappear | Çok yüksek | Kritik veriler |
| 3 | willResignActive | Maksimum | Uygulama arka plana alındığında |
Öneri: kritik kullanıcı verileri için üç seviyenin tümünün bir kombinasyonunu kullanın. Kritik olmayan durum için ilk seviye yeterlidir. Aynı verileri birden çok kez kaydetmemek önemlidir — son kaydetmeden bu yana verilerin değiştiğini belirten bir dirty bayrağı kullanın.
Kullanıcının veri girdiği CRUD ekranları için stratejiye özel dikkat gösterilmelidir. Bu tür ekranlarda viewWillDisappear'da her tuş vuruşunu kaydetmek önerilmez — bu aşırıdır. Timer aracılığıyla gecikmeli (debounce) otomatik kaydetme kullanın ve viewWillDisappear'ı yalnızca kaydedilmemiş değişiklikler varsa son zorunlu kaydetme için kullanın. Bu yaklaşım, performans ve veri bütünlüğü arasında denge kurar.
Core Data kullanan uygulamalar için ek bir önlem, yalnızca yönetilen nesne bağlamında gerçek değişiklikler olduğunda viewWillDisappear'da saveContext'i çağırmaktır. Kaydetmeden önce context.hasChanges'i kontrol etmek, kalıcı depolamaya gereksiz yazmaları önler ve cihazın pil ömrünü uzatır. Bu kontrolü applicationDidEnterBackground'daki genel kaydetmeyle birleştirin.
Yanlış kullanım viewWillDisappear, veri kaybına, bellek sızıntılarına ve dengesiz uygulama davranışına yol açabilir. Sık görülen iOS geliştirici hatalarını inceleyelim.
Birinci hata — verileri yalnızca viewWillDisappear'da kaydetmek. Yukarıda tartışıldığı gibi, etkileşimli pop jestinde metod, ekran kaybolmamış olsa bile çağrılır. Kaydetmenin yan etkileri varsa — sunucuya veri gönderme, durumu değiştirme — bu yanlış tetiklemelere yol açabilir. isBeingDismissed veya isMovingFromParent kontrolü ekleyin.
İkinci hata — NotificationCenter'dan aboneliği iptal etmemek. Bu, iOS'taki en yaygın bellek sızıntılarından biridir. viewWillAppear'da UIResponder.keyboardWillShowNotification'a abone olduysanız ancak viewWillDisappear'da aboneliği iptal etmediyseniz, closure çağrılmaya devam eder. Denetleyicinin deinit'inde closure, ayrılmış bir nesneye başvurur — uygulama çökmesi garantidir.
Üçüncü hata — ağır senkron işlemler gerçekleştirmek. viewWillDisappear'da büyük miktarda veri kaydetmek, Core Data'ya veya dosya sistemine yazmak ana iş parçacığını bloke eder. İşlem geçiş animasyonundan daha uzun sürerse, UIKit iş parçacığını duraklatır ve arayüz donar. Ağır kaydetmeleri arka plan kuyruklarına taşıyın.
Dördüncü hata — super'i çağırmayı unutmak. super.viewWillDisappear'ı çağırmamak, bu metodu iç durumları için kullanan UINavigationController ve UITabBarController'ı bozabilir. Apple dokümantasyonunu izleyerek her zaman super'i önce veya en son çağırın.
Bu sorun, aktif çoklu görev ve uygulama değiştirme özelliğine sahip iOS'ta daha da kötüleşir. Beşinci hata — viewWillDisappear'da kaydetmeden sonra DispatchQueue.main.async kullanmak. super.viewWillDisappear'ı çağırdıktan sonra ana kuyruğa eşzamansız olarak bir blok gönderirseniz, blok yürütüldüğünde denetleyicinin hala var olduğuna dair bir garanti yoktur. Ayrılmış belleğe erişimi ve uygulama çökmelerini önlemek için closure'ların içinde her zaman zayıf referanslar [weak self] kullanın.
Sıkça Sorulan Sorular
viewWillDisappear, kaybolmanın başlangıcında, ekran hala görünürken çağrılır. viewDidDisappear, ekran tamamen gizlendikten ve animasyon tamamlandıktan sonra çağrılır.
Kaydetmeyi onaylamak için viewDidDisappear kullanın veya ekranın gerçekten kaybolup kaybolmayacağını belirlemek için viewWillDisappear içinde isMovingFromParent ve isBeingDismissed özelliklerini kontrol edin.
Evet, kesinlikle self ile bloklar veya seçiciler kullanıyorsanız. ARC, NotificationCenter aboneliklerini yönetmez. iOS 9+'da bloklar için zayıf bir referans kullanın ve viewWillDisappear'da aboneliği iptal edin.
Hiçbir şekilde — force quit, yaşam döngüsü metotlarını çağırmaz. Uygulama sonlandırmada garantili kaydetme için UIApplication.willTerminateNotification kullanın veya veriler değiştikçe gerçek zamanlı olarak kaydedin.
Evet, etkileşimli pop jestinde UIKit, jest başladıktan hemen sonra viewWillDisappear'ı çağırır. Kullanıcı jesti iptal ederse, ekran görünür kalır ancak metod zaten tetiklenmiştir. Her zaman isMovingFromParent'i kontrol edin.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun