.onDisappear — interfeys iyerarxiyasından View silindikdə closure icra edən SwiftUI modifikatorudur. Çağırış ekran bağlandıqda, tab dəyişdirildikdə, modal pəncərə dismiss edildikdə və ya element görünmə zonasından kənara scroll edildikdə baş verir. Apple Developer Documentation-a (2026) görə, onDisappear qəza başa çatması və ya sistem-watchdog tərəfindən tətbiqin məhv edilməsi ssenarilərində çağırışa zəmanət vermir. SwiftUI haqqında daha ətraflı SwiftUI materialında oxuyun.
Əsas məqamlar
.onDisappear — SwiftUI-də View-in iyerarxiyadan silinməsi zamanı Void closure qəbul edən və onu icra edən View modifikatorudur. .onAppear ilə birlikdə ekranın tam həyat dövrünü formalaşdırır: görünmə — işləmə — yox olma. Apple onDisappear-ı SwiftUI-nin iOS 13-də buraxılışı ilə birlikdə UIKit-dən viewDidDisappear-ın analoqu kimi təqdim etdi.
Sintaktik olaraq .onDisappear onAppear ilə eynidir: istənilən View-i modifikasiya edir və SwiftUI komponenti tərəfindən görünüş silindikdə çağırılan closure əlavə edir. UIKit-dən fərqli olaraq, viewDidDisappear yalnız keçid animasiyası başa çatdıqdan sonra işə düşür, SwiftUI-də onDisappear animasiya bitməzdən əvvəl — View silinməyə qeyd edildiyi anda çağırıla bilər.
Əsas sintaksis onDisappear onAppear qədər yığcamdır. Modifikator əlavə parametr qəbul etmir — yalnız əsas thread-də sinxron icra olunan closure.
struct DetailView: View {
var body: some View {
Text("Təfərrüat Ekranı")
.onDisappear {
print("DetailView ekrandan yox oldu")
}
}
}
Çağırış mexanizmi onDisappear onAppear-ın əksidir: əvvəl uşaq elementlər onDisappear alır, sonra valideyn. Bu child-first qaydası uşaq elementlərin resurslarının valideyn resurslarından əvvəl sərbəst buraxılmasını təmin edir. Əgər uşaq element valideynin məlumatlarından asılıdırsa, valideyn konteksti olmadan düzgün başa çata bilməlidir.
SwiftUI onDisappear-ı View render qrafından xaric edildiyi anda çağırır. Tetikləyici ola bilər: NavigationStack-dən pop, TabView-in dəyişdirilməsi, modal pəncərənin dismiss-i (sheet/fullScreenCover), şərti olaraq göstərilən View-in dəyişməsi (if/switch). List və ScrollView-də onDisappear hücrə prefetch-buferdən kənara scroll edildikdə çağırılır.
Child-first sırası o deməkdir ki, VStack-də üç uşaq View varsa, onDisappear əvvəl hər bir uşaq üçün tərs qaydada, sonra valideyn üçün çağırılacaq. Bu düzgün təmizləmə üçün vacibdir: uşaq taymerləri valideyn ViewModel-in paylaşılan resursları sərbəst buraxmasından əvvəl ləğv edilir.
struct ParentView: View {
var body: some View {
VStack {
ChildView(id: "A")
ChildView(id: "B")
}
.onDisappear {
print("Parent onDisappear — son")
}
}
}
struct ChildView: View {
let id: String
var body: some View {
Text("Uşaq \(id)")
.onDisappear {
print("Uşaq \(id) onDisappear")
}
}
}
Konsol çıxışı: Child B onDisappear, Child A onDisappear, Parent onDisappear — sonuncu. onAppear ilə müqayisədə tərs sıra düzgün sərbəst buraxma zəncirini təmin edir.
Çağırış ssenariləri onDisappear konteynerin növündən asılıdır. NavigationStack-də onDisappear pop-to-root, adi pop-back və ya sürüşdürmə jesti ilə ekranın silinməsi (interactivePopGestureRecognizer) zamanı işə düşür. TabView-də tab dəyişdirilməsi gizlədilən üçün onDisappear, göstərilən üçün onAppear çağırır — hər iki modifikator demək olar ki, eyni anda işə düşür.
Sheet və fullScreenCover-də onDisappear proqramlı dismiss ( @Environment(\.dismiss) vasitəsilə) və ya aşağı sürüşdürmə jesti zamanı çağırılır. Vacib xüsusiyyət: əgər sheet açılıbsa, lakin istifadəçi tətbiqi dəyişibsə, onDisappear faktiki bağlanmaya qədər çağırılmır.
| Ssenari | onDisappear çağırılır | Qeyd |
|---|---|---|
| NavigationStack-də Pop | Bəli | Animasiyadan dərhal sonra |
| TabView tabının dəyişdirilməsi | Bəli | Cari tab |
| Sheet dismiss | Bəli | Animasiya bitməzdən əvvəl |
| List-də Scroll | Bəli | Hücrə prefetch-zonasından çıxdı |
| Tətbiqin yığışdırılması | Xeyr | Çağırışa zəmanət yoxdur |
| Crash/watchdog kill | Xeyr | Çağırılmır |
Əsas ssenarilər onDisappear — resursların təmizlənməsi, vəziyyətin saxlanması və izləmədir. onAppear-dan fərqli olaraq, onDisappear tapşırıqları çıxışda icra olunur və dublikasiya yoxlaması tələb etmir, çünki View bir dəfə yox olur.
Vəziyyətin saxlanması onDisappear-da forma məlumatlarının ekrandan çıxarkən saxlanmalı olduğu hallar üçün xüsusilə faydalıdır. Taymerlər və Combine abunəlikləri onDisappear-da ləğv edilir ki, ekrana qayıtdıqda sızmaların qarşısı alınsın.
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")
}
}
Taymerin ləğvi onDisappear-da ekran bağlandıqdan sonra kodun icrasının qarşısını alır. Ləğv olmadan taymer artıq cari View-ə aid olmayan @State-i yeniləməyə cəhd edərək runtime warning yarada bilər.
Ekranda qalma müddəti — klassik izləmə ssenarisidir. Vaxtı onAppear-da qeyd edirik, fərqi onDisappear-da hesablayırıq və sessiya müddəti ilə analitik hadisə göndəririk.
struct TrackedView: View {
@State private var appearTime: Date?
var body: some View {
Text("İzlənən 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)
])
}
}
}
}
Əsas fərq onDisappear ilə onAppear arasında — çağırış sırası və işə düşmə zəmanətləridir. onAppear View iyerarxiyaya əlavə edildikdə çağırılır və yenidən yaradıldıqda təkrar çağırılma xüsusiyyətinə malikdir. onDisappear silinmə zamanı çağırılır və yalnız normal bağlanmada zəmanətli işləyir, lakin qəza ssenarilərində yox.
WWDC 2024-ə görə, Apple onDisappear-ı təmizləmə nöqtəsi kimi qəbul etməyi tövsiyə edir, məlumatların yazılma nöqtəsi kimi deyil. Kritik vacib məlumatlar (ödənişlər, qeydiyyatlar) real vaxtda saxlanmalıdır, View-in yox olma anında yox, çünki onDisappear tətbiq yığışdırıldıqda çağırışa zəmanət vermir.
| Xüsusiyyət | .onAppear | .onDisappear |
|---|---|---|
| Çağırış anı | View iyerarxiyaya əlavə edilir | View iyerarxiyadan silinir |
| Sıra | Parent-first | Child-first |
| Zəmanət | Yüksək | Qəza başa çatmalarında yox |
| Əsas vəzifə | İlkinləşdirmə | Təmizləmə |
| Təkrar çağırış | View yenidən yaradıldıqda | Hər yox olma üçün bir dəfə |
Tövsiyə: onDisappear-ı yalnız qeyri-kritik təmizləmə və izləmə üçün istifadə edin. Məlumatların saxlanması üçün scenePhase və ya AppDelegate-də applicationWillTerminate bildirişlərindən istifadə edin.
Ssenari 1: YouTube bənzəri yükləmə. Video detalları ekranında onDisappear oxutma mövqeyini UserDefaults-da saxlayır. Təkrar açıldıqda onAppear mövqeyi UserDefaults-dan bərpa edərək fasiləsiz izləmə effekti yaradır.
Ssenari 2: Combine abunəliyinin ləğvi. ViewModel Combine publisher-ləri istifadə edirsə, onDisappear abunəliyi cancellable?.cancel() vasitəsilə ləğv edir. Bu, ekrandan çıxdıqdan sonra UI yenilənməsinin qarşısını alır, bu da paginasiyalı siyahılar və axtarış sorğuları üçün xüsusilə vacibdir.
Ssenari 3: WebSocket-in bağlanması. Real-vaxt əlaqələri olan tətbiqlərdə (messencerlər, kotirovka lentləri) onDisappear batareya və trafikə qənaət üçün WebSocket bağlantısını bağlayır. Ekrana qayıtdıqda onAppear-da yenidən açılır.
WebSocket — ekrandan çıxarkən bağlanmalı olan tipik resursdur. Aşağıdakı nümunədə onDisappear socket-i ayırır, onAppear isə yenidən qoşur, bu da çox ekranlı tətbiqlər üçün əhəmiyyətli trafik qənaəti verir.
struct ChatView: View {
@StateObject private var socket = WebSocketManager()
var body: some View {
ChatListView(messages: socket.messages)
.onAppear {
socket.connect()
}
.onDisappear {
socket.disconnect()
}
}
}
Vacib: TabView-də tablar arasında keçid zamanı cari tabın onDisappear-ı və növbəti tabın onAppear-ı demək olar ki, eyni anda işə düşür. WebSocket üçün bu əlavə yük yaradan disconnect-connect dövrünə səbəb ola bilər. Həll yolu — gecikmə və ya növbəti ekranda socket-in lazım olub-olmadığını yoxlamaqdır.
Tez-tez verilən suallar
Bəli, .onDisappear tətbiqin qəza başa çatması (crash, watchdog kill), ekranı bağlamadan tətbiqin yığışdırılması və ya tətbiqin fonda məhv edilməsi ssenarilərində çağırışa zəmanət vermir. Kritik vacib məlumatlar üçün scenePhase və ya applicationWillTerminate istifadə edin.
.onDisappear View iyerarxiyadan silindikdə işə düşür — müəyyən ekran üçün lokal callback. .scenePhase ( @Environment(\.scenePhase) vasitəsilə) bütün tətbiqin vəziyyəti dəyişdikdə işə düşür: active, inactive, background. Ekranda vaxtın izlənməsi üçün onAppear+onDisappear, qlobal vəziyyətin saxlanması üçün scenePhase istifadə edin.
Səbəb — tablar arasında sürətli keçid və ya eyni ekranın təkrar push/pop edilməsidir. SwiftUI yeni View nüsxəsi yarada, köhnəni silə, yenidən yarada bilər — hər dəfə onDisappear və onAppear çağırılır. .id(), .equatable() istifadə edib-etmədiyinizi və ya valideynin body-sində View-in yenidən yaradılıb-yaradılmadığını yoxlayın.
Bəli, .onDisappear macOS-da (10.15+) tam dəstəklənir eyni davranışla: pəncərə bağlandıqda, split view paneli silindikdə və ya modal pəncərə dismiss edildikdə çağırılır. macOS-da onDisappear yalnız bağlanma zamanı deyil, həm də pəncərə gizlədildikdə (hide) çağırılır ki, bu da macOS tətbiqləri üçün vacibdir.
URLSessionTask-ə istinadı @State-də saxlayın və onDisappear-da task.cancel() çağırın. Alternativ olaraq .task modifikatorundan istifadə edin, o, View yox olduqda async əməliyyatı avtomatik ləğv edir. .task URLSession daxil olmaqla bütün async əməliyyatlar üçün üstünlük veriləndir.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun