.onDisappear: iş prinsipi və SwiftUI-də tətbiqi

Müəllif: IT Sectr Dərc olunub: 2026-06-26 Oxuma vaxtı: 10 dəq

.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 — View yox olduqda kod icrası üçün SwiftUI modifikatoru.
  • Simmetriklik — onDisappear onAppear-a qoşadır və tərs qaydada çağırılır.
  • Resursların təmizlənməsi — əsas ssenari: taymerlərin ləğvi, bağlantıların bağlanması, vəziyyətin saxlanması.
  • Analitika — onDisappear vasitəsilə screen close, dwell time, session end hadisələri göndərilir.
  • Zəmanətin olmaması — onDisappear tətbiqin qəza başa çatması zamanı çağırılmır.

.onDisappear nədir?

.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.

onDisappear sintaksisi

Ə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.

swift
struct DetailView: View {
    var body: some View {
        Text("Təfərrüat Ekranı")
            .onDisappear {
                print("DetailView ekrandan yox oldu")
            }
    }
}

.onDisappear necə işləyir

Ç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 çağırış sırası

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.

swift
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.

.onDisappear nə vaxt çağırılır

Ç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.

SsenarionDisappear çağırılırQeyd
NavigationStack-də PopBəliAnimasiyadan dərhal sonra
TabView tabının dəyişdirilməsiBəliCari tab
Sheet dismissBəliAnimasiya bitməzdən əvvəl
List-də ScrollBəliHücrə prefetch-zonasından çıxdı
Tətbiqin yığışdırılmasıXeyrÇağırışa zəmanət yoxdur
Crash/watchdog killXeyrÇağırılmır

.onDisappear nümunələri

Ə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ı və taymerlərin ləğvi

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.

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")
    }
}

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 vaxtın izlənməsi

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.

swift
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)
                    ])
                }
            }
    }
}

.onDisappear vs .onAppear — fərqlər

Ə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ə edilirView iyerarxiyadan silinir
SıraParent-firstChild-first
ZəmanətYüksəkQəza başa çatmalarında yox
Əsas vəzifəİlkinləşdirməTəmizləmə
Təkrar çağırışView yenidən yaradıldıqdaHə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.

Tipik tətbiq ssenariləri

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-in onDisappear-da bağlanması

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.

swift
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

.onDisappear çağırılmay bilər?

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-ı .scenePhase-dən necə ayırd etməli?

.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.

Niyə .onDisappear ard-arda bir neçə dəfə çağırılır?

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.

.onDisappear macOS-da SwiftUI-də işləyir?

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.

.onDisappear-da URLSessionTask necə ləğv edilməli?

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ə

  • .onDisappear — View yox olduqda resursların təmizlənməsi və izləmə üçün onAppear-a qoşa modifikator.
  • Child-first sırası — uşaq View-lər düzgün sərbəst buraxma zənciri üçün onDisappear-ı valideyndən əvvəl alır.
  • Çağırışa zəmanət yoxdur — crash, yığışdırma və ya sistem başa çatması zamanı onDisappear işləməyə bilər.
  • Əsas ssenarilər — taymerlərin ləğvi, WebSocket-in bağlanması, vəziyyətin saxlanması, müddətin izlənməsi.
  • Analitika — onDisappear Date().timeIntervalSince vasitəsilə dwell time hesablanması ilə screen_close hadisələri göndərir.
  • Async əməliyyatlar üçün — onDisappear əvəzinə Task {} ilə .task istifadə edin, çünki .task sorğuları avtomatik ləğv edir.

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.

Layihəni müzakirə et

Həm də oxuyun