.onDisappear: ishlash prinsipi va SwiftUIda qo'llanilishi

Muallif: IT Sectr Nashr etilgan: 2026-06-26 O'qish vaqti: 10 daq

.onDisappear — interfeys iyerarxiyasidan View olib tashlanganda yopilishni bajaradigan SwiftUI modifikatori. Chaqiruv ekran yopilganda, tab almashtirilganda, modal oyna dismiss qilinganda yoki element ko'rinish maydonidan tashqariga scroll qilinganda sodir bo'ladi. Apple Developer Documentation (2026) ma'lumotlariga ko'ra, onDisappear favqulodda tugatish yoki dasturni system-watchdog tomonidan yo'q qilish stsenariylarida chaqiruvni kafolatlamaydi. SwiftUI haqida batafsil SwiftUI materialida o'qing.

Asosiy

  • .onDisappear — View yo'qolganda kod bajarish uchun SwiftUI modifikatori.
  • Simmetriklik — onDisappear onAppear-ga juft va teskari tartibda chaqiriladi.
  • Resurslarni tozalash — asosiy stsenariy: taymerlarni bekor qilish, ulanishlarni yopish, holatni saqlash.
  • Analitika — onDisappear orqali screen close, dwell time, session end hodisalari yuboriladi.
  • Kafolat yo'qligi — onDisappear dastur favqulodda tugatilganda chaqirilmaydi.

.onDisappear nima?

.onDisappear — SwiftUI-da View iyerarxiyadan olib tashlanganda Void yopilishini qabul qiladigan va uni bajaradigan View modifikatori. .onAppear bilan birgalikda ekranning to'liq hayot aylanishini tashkil qiladi: paydo bo'lish — ishlash — yo'qolish. Apple onDisappear-ni SwiftUI-ning iOS 13 da chiqishi bilan UIKit-dagi viewDidDisappear-ning analogi sifatida taqdim etdi.

Sintaktik jihatdan .onDisappear onAppear bilan bir xil: har qanday View-ni modifikatsiyalaydi va SwiftUI komponenti tomonidan ko'rinish olib tashlanganda chaqiriladigan yopilishni biriktiradi. UIKit-dan farqli o'laroq, viewDidDisappear faqat o'tish animatsiyasi tugagandan so'ng ishga tushadi, SwiftUI-da onDisappear animatsiya tugashidan oldin — View o'chirishga belgilangan paytda chaqirilishi mumkin.

onDisappear sintaksisi

Asosiy sintaksis onDisappear onAppear kabi ixchamdir. Modifikator qo'shimcha parametrlarni qabul qilmaydi — faqat asosiy oqimda sinxron bajariladigan yopilish.

swift
struct DetailView: View {
    var body: some View {
        Text("Tafsilot Ekrani")
            .onDisappear {
                print("DetailView ekrandan yo'qoldi")
            }
    }
}

.onDisappear qanday ishlaydi

Chaqirish mexanizmi onDisappear onAppear-ning aksi: avval bolaviy elementlar onDisappear oladi, keyin ota-ona. Ushbu child-first qoidasi bolaviy elementlarning resurslari ota-ona resurslaridan oldin bo'shatilishini kafolatlaydi. Agar bolaviy element ota-onaning ma'lumotlariga bog'liq bo'lsa, u ota-ona kontekstisiz to'g'ri yakunlanishi kerak.

SwiftUI onDisappear-ni View render grafigidan chiqarilgan paytda chaqiradi. Tetiklantiruvchi bo'lishi mumkin: NavigationStack-dan pop, TabView-ni almashtirish, modal oynani dismiss qilish (sheet/fullScreenCover), shartli ko'rsatilgan View-ni o'zgartirish (if/switch). List va ScrollView-da onDisappear hujayra prefetch buferidan tashqariga scroll qilinganda chaqiriladi.

Child-first chaqirish tartibi

Child-first tartibi shuni anglatadiki, VStack-da uchta bolaviy View bo'lsa, onDisappear avval har bir bola uchun teskari tartibda, keyin ota-ona uchun chaqiriladi. Bu to'g'ri tozalash uchun juda muhim: bolaviy taymerlar ota-ona ViewModel umumiy resurslarni bo'shatishidan oldin bekor qilinadi.

swift
struct ParentView: View {
    var body: some View {
        VStack {
            ChildView(id: "A")
            ChildView(id: "B")
        }
        .onDisappear {
            print("Parent onDisappear — oxirgi")
        }
    }
}

struct ChildView: View {
    let id: String
    var body: some View {
        Text("Bola \(id)")
            .onDisappear {
                print("Bola \(id) onDisappear")
            }
    }
}

Konsol chiqishi: Child B onDisappear, Child A onDisappear, Parent onDisappear — oxirgi. onAppear bilan solishtirganda teskari tartib to'g'ri bo'shatish zanjirini kafolatlaydi.

.onDisappear qachon chaqiriladi

Chaqirish stsenariylari onDisappear konteyner turiga bog'liq. NavigationStack-da onDisappear pop-to-root, oddiy pop-back yoki ekranni surish jesti bilan olib tashlash (interactivePopGestureRecognizer) paytida ishga tushadi. TabView-da tab almashtirish yashirilayotgan uchun onDisappear va ko'rsatilayotgan uchun onAppear chaqiradi — ikkala modifikator deyarli bir vaqtda ishga tushadi.

Sheet va fullScreenCover da onDisappear dasturiy dismiss ( @Environment(\.dismiss) orqali) yoki pastga surish jesti bilan chaqiriladi. Muhim xususiyat: agar sheet ochilgan bo'lsa, lekin foydalanuvchi dasturni almashtirgan bo'lsa, onDisappear haqiqiy yopilishgacha chaqirilmaydi.

StsenariyonDisappear chaqiriladiIzoh
NavigationStack-da PopHaAnimatsiyadan so'ng darhol
TabView tabini almashtirishHaJoriy tab
Sheet dismissHaAnimatsiya tugashidan oldin
List-da ScrollHaHujayra prefetch zonasidan chiqdi
Dasturni yig'ishYo'qChaqiruv kafolati yo'q
Crash/watchdog killYo'qChaqirilmaydi

.onDisappear misollari

Asosiy stsenariylar onDisappear — resurslarni tozalash, holatni saqlash va kuzatish. onAppear-dan farqli o'laroq, onDisappear vazifalari chiqishda bajariladi va takrorlanishni tekshirishni talab qilmaydi, chunki View bir marta yo'qoladi.

Holatni saqlash va taymerlarni bekor qilish

Holatni saqlash onDisappear-da ayniqsa ma'lumotlarni ekrandan chiqishda saqlanishi kerak bo'lgan formalar uchun foydalidir. Taymerlar va Combine obunalari onDisappear-da bekor qilinadi, bu ekranga qaytishda xotira oqishining oldini oladi.

swift
struct FormView: View {
    @State private var draftText = ""
    @State private var timer: Timer?
    
    var body: some View {
        TextField("Enter text", text: $draftText)
            .onAppear {
                timer = Timer.scheduledTimer(withTimeInterval: 60, repeats: true) { _ in
                    saveDraft()
                }
            }
            .onDisappear {
                timer?.invalidate()
                timer = nil
                saveDraft()
            }
    }
    
    private func saveDraft() {
        UserDefaults.standard.set(draftText, forKey: "draft")
    }
}

Taymerni bekor qilish onDisappear-da ekran yopilgandan keyin kod bajarilishining oldini oladi. Bekor qilmasdan, taymer joriy View-ga tegishli bo'lmagan @State-ni yangilashga urinib, runtime warning keltirib chiqarishi mumkin.

Ekranda vaqtni kuzatish

Ekranda qolish muddati — klassik kuzatish stsenariysi. Vaqtni onAppear-da belgilaymiz, farqni onDisappear-da hisoblaymiz va sessiya davomiyligi bilan analitik hodisa yuboramiz.

swift
struct TrackedView: View {
    @State private var appearTime: Date?
    
    var body: some View {
        Text("Kuzatilgan Ekran")
            .onAppear {
                appearTime = Date()
                Analytics.shared.logEvent("screen_view", params: ["screen": "TrackedView"])
            }
            .onDisappear {
                if let start = appearTime {
                    let duration = Date().timeIntervalSince(start)
                    Analytics.shared.logEvent("screen_close", params: [
                        "screen": "TrackedView",
                        "duration_ms": Int(duration * 1000)
                    ])
                }
            }
    }
}

.onDisappear vs .onAppear — farqlar

Asosiy farq onDisappear va onAppear o'rtasida — chaqirish tartibi va ishga tushish kafolatlari. onAppear View iyerarxiyaga qo'shilganda chaqiriladi va qayta yaratilganda qayta chaqirilish xususiyatiga ega. onDisappear o'chirishda chaqiriladi va faqat normal yopilishda kafolatlanadi, ammo favqulodda stsenariylarda emas.

WWDC 2024 ma'lumotlariga ko'ra, Apple onDisappear-ni tozalash nuqtasi sifatida ko'rib chiqishni tavsiya qiladi, ma'lumotlarni saqlash nuqtasi sifatida emas. Kritik muhim ma'lumotlar (to'lovlar, ro'yxatdan o'tishlar) real vaqtda saqlanishi kerak, View yo'qolish paytida emas, chunki onDisappear dastur yig'ilganda chaqiruvni kafolatlamaydi.

Xususiyat.onAppear.onDisappear
Chaqirish paytiView iyerarxiyaga qo'shiladiView iyerarxiyadan o'chiriladi
TartibParent-firstChild-first
KafolatYuqoriFavqulodda tugashlarda yo'q
Asosiy vazifaIshga tushirishTozalash
Qayta chaqirishView qayta yaratilgandaHar yo'qolishda bir marta

Tavsiya: onDisappear-ni faqat kritik bo'lmagan tozalash va kuzatish uchun foydalaning. Ma'lumotlarni saqlash uchun scenePhase yoki AppDelegate-dagi applicationWillTerminate bildirishnomalaridan foydalaning.

Oddiy qo'llanish stsenariylari

Stsenariy 1: YouTube-ga o'xshash yuklash. Video tafsilotlari ekranida onDisappear ijro etish pozitsiyasini UserDefaults-da saqlaydi. Qayta ochilganda onAppear pozitsiyani UserDefaults-dan tiklab, uzluksiz ko'rish effektini yaratadi.

Stsenariy 2: Combine obunasini bekor qilish. ViewModel Combine publisher-laridan foydalansa, onDisappear obunani cancellable?.cancel() orqali bekor qiladi. Bu ekrandan chiqqandan keyin UI yangilanishining oldini oladi, bu ayniqsa paginatsiyali ro'yxatlar va qidiruv so'rovlari uchun muhim.

Stsenariy 3: WebSocket-ni yopish. Real-vaqt ulanishlari bo'lgan dasturlarda (messendjerlar, kotirovkalar lentasi) onDisappear batareya va trafikni tejash uchun WebSocket ulanishini yopadi. Ekranga qaytganda onAppear-da qayta ochiladi.

WebSocket-ni onDisappear-da yopish

WebSocket — ekrandan chiqishda yopilishi kerak bo'lgan odatiy resurs. Quyidagi misolda onDisappear socket-ni uzadi, onAppear esa qayta ulaydi, bu ko'p ekranli dasturlar uchun sezilarli trafik tejash imkonini beradi.

swift
struct ChatView: View {
    @StateObject private var socket = WebSocketManager()
    
    var body: some View {
        ChatListView(messages: socket.messages)
            .onAppear {
                socket.connect()
            }
            .onDisappear {
                socket.disconnect()
            }
    }
}

Muhim: TabView-da tablar o'rtasida o'tish paytida joriy tabning onDisappear va keyingi tabning onAppear deyarli bir vaqtda ishga tushadi. WebSocket uchun bu qo'shimcha yuklama yaratadigan disconnect-connect sikliga olib kelishi mumkin. Yechim — kechikishdan foydalanish yoki keyingi ekranda socket kerakligini tekshirish.

Tez-tez so'raladigan savollar

.onDisappear chaqirilmasligi mumkinmi?

Ha, .onDisappear dasturning favqulodda tugatilishi (crash, watchdog kill), ekranni yopmasdan dasturni yig'ish yoki dastur fonda yo'q qilinadigan tizim stsenariysida chaqiruvni kafolatlamaydi. Kritik muhim ma'lumotlar uchun scenePhase yoki applicationWillTerminate dan foydalaning.

.onDisappear-ni .scenePhase-dan qanday farqlash kerak?

.onDisappear View iyerarxiyadan olib tashlanganda ishga tushadi — muayyan ekran uchun lokal callback. .scenePhase ( @Environment(\.scenePhase) orqali) butun dastur holati o'zgarganda ishga tushadi: active, inactive, background. Ekranda vaqtni kuzatish uchun onAppear+onDisappear, global holatni saqlash uchun scenePhase dan foydalaning.

Nega .onDisappear ketma-ket bir necha marta chaqiriladi?

Sabab — tablar o'rtasida tez o'tish yoki bir ekranning takroriy push/pop qilinishi. SwiftUI yangi View nusxasini yaratishi, eskisini o'chirishi, qayta yaratishi mumkin — har safar onDisappear va onAppear chaqiriladi. .id(), .equatable() ishlatayotganingizni yoki ota-ona body-sida View-ni qayta yaratayotganingizni tekshiring.

.onDisappear macOS-da SwiftUI-da ishlaydimi?

Ha, .onDisappear macOS-da (10.15+) to'liq qo'llab-quvvatlanadi xuddi shu xatti-harakat bilan: oyna yopilganda, split view paneli o'chirilganda yoki modal oyna dismiss qilinganda chaqiriladi. macOS-da onDisappear faqat yopilishda emas, balki oyna yashirilganda (hide) ham chaqiriladi, bu macOS dasturlari uchun muhim.

URLSessionTask-ni .onDisappear-da qanday bekor qilish kerak?

URLSessionTask-ga havolani @State-da saqlang va onDisappear-da task.cancel() ni chaqiring. Shu bilan birga, .task modifikatoridan foydalaning, u View yo'qolganda async operatsiyani avtomatik bekor qiladi. .task barcha async operatsiyalar, jumladan URLSession uchun afzal ko'riladi.

Xulosa

  • .onDisappear — View yo'qolganda resurslarni tozalash va kuzatish uchun onAppear-ga juft modifikator.
  • Child-first tartibi — bolaviy View-lar onDisappear-ni ota-onadan oldin to'g'ri bo'shatish zanjiri uchun oladi.
  • Chaqiruv kafolati yo'q — crash, yig'ish yoki tizim tugashida onDisappear ishlamasligi mumkin.
  • Asosiy stsenariylar — taymerlarni bekor qilish, WebSocket-ni yopish, holatni saqlash, muddatni kuzatish.
  • Analitika — onDisappear Date().timeIntervalSince orqali dwell time hisoblash bilan screen_close hodisalarini yuboradi.
  • Async operatsiyalar uchun — onDisappear o'rniga Task {} bilan .task dan foydalaning, chunki .task so'rovlarni avtomatik bekor qiladi.

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