iOS'ta viewWillDisappear — metodun özü ve doğru kullanımı

Yazar: IT Sectr Yayınlanma: 2026-03-05 Okuma süresi: 8 dk

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 her ekran kaybolmasından önce çağrılır
  • Taslakların ve geçici verilerin durumunu kaydetmek için kullanılır
  • NotificationCenter ve KVO'dan aboneliği iptal etmek bu metotta zorunlu bir görevdir
  • Metod iptal edilen bir jest üzerinde çağrılabilir — viewDidDisappear'da verileri çoğaltın
  • super.viewWillDisappear doğru navigasyon için zorunludur

viewWillDisappear Nedir

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 Ne Zaman Çağrılır

viewWillDisappear, mevcut ekranın artık aktif olmadığı tüm senaryolarda çağrılır. iOS geliştirmeye özgü ana durumları inceleyelim.

Yeni bir ekran push edildiğinde

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.

Mevcut ekran pop edildiğinde

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.

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

Bir denetleyici dismiss edildiğinde

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.

TabBar sekmeleri değiştirildiğinde

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'da Pratik Görevler

viewWillDisappear, kaynak ve durum yönetimiyle ilgili belirli görevleri çözer. Kod örnekleriyle ana senaryoları inceleyelim.

Kullanıcı verilerini kaydetme

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.

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

Bildirimlerden aboneliği iptal etme

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.

Animasyonları ve zamanlayıcıları durdurma

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.

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

Verileri geri gönderme

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.

Durum Kaydetme Stratejisi

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.

SeviyeMetod/BildirimGüvenilirlikKullanım
1viewWillDisappearYüksekUI durumu, taslaklar
2viewDidDisappearÇok yüksekKritik veriler
3willResignActiveMaksimumUygulama 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.

viewWillDisappear'da Yaygın Hatalar

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 ve viewDidDisappear arasındaki fark nedir?

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.

İptal edilen pop jestiyle ne yapmalı?

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.

NotificationCenter'dan manuel olarak abonelik iptal etmek gerekli mi?

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.

Force quit sırasında viewWillDisappear aracılığıyla veriler nasıl kaydedilir?

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.

Denetleyici kaybolmuyorken viewWillDisappear çağrılabilir mi?

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

  • viewWillDisappear her ekran kaybolmasından önce çağrılır — push, pop, present ve dismiss sırasında
  • Ana amacı durum kaydetme, bildirimlerden aboneliği iptal etme ve animasyonları durdurmadır
  • Etkileşimli jestlerle metod, ekranın gerçekten gizlenmesi olmadan çağrılabilir
  • Kritik kullanıcı verileri için üç seviyeli bir kaydetme stratejisi kullanın
  • viewWillDisappear'da NotificationCenter'dan aboneliği iptal etmek bellek sızıntılarını önler
  • Ağır senkron işlemler ana iş parçacığını bloke eder — bunları arka plan kuyruklarına taşıyın
  • Doğru navigasyonu sürdürmek için her zaman super.viewWillDisappear çağırın

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.

Projeyi tartış

Ayrıca okuyun