.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 — 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.
Asosiy sintaksis onDisappear onAppear kabi ixchamdir. Modifikator qo'shimcha parametrlarni qabul qilmaydi — faqat asosiy oqimda sinxron bajariladigan yopilish.
struct DetailView: View {
var body: some View {
Text("Tafsilot Ekrani")
.onDisappear {
print("DetailView ekrandan yo'qoldi")
}
}
}
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 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.
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.
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.
| Stsenariy | onDisappear chaqiriladi | Izoh |
|---|---|---|
| NavigationStack-da Pop | Ha | Animatsiyadan so'ng darhol |
| TabView tabini almashtirish | Ha | Joriy tab |
| Sheet dismiss | Ha | Animatsiya tugashidan oldin |
| List-da Scroll | Ha | Hujayra prefetch zonasidan chiqdi |
| Dasturni yig'ish | Yo'q | Chaqiruv kafolati yo'q |
| Crash/watchdog kill | Yo'q | Chaqirilmaydi |
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 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.
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 qolish muddati — klassik kuzatish stsenariysi. Vaqtni onAppear-da belgilaymiz, farqni onDisappear-da hisoblaymiz va sessiya davomiyligi bilan analitik hodisa yuboramiz.
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)
])
}
}
}
}
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 payti | View iyerarxiyaga qo'shiladi | View iyerarxiyadan o'chiriladi |
| Tartib | Parent-first | Child-first |
| Kafolat | Yuqori | Favqulodda tugashlarda yo'q |
| Asosiy vazifa | Ishga tushirish | Tozalash |
| Qayta chaqirish | View qayta yaratilganda | Har 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.
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 — 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.
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
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 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.
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.
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-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
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.