.onDisappear: कार्य सिद्धांत और SwiftUI में उपयोग

लेखक: IT Sectr प्रकाशित: 2026-06-26 पढ़ने का समय: 10 मिनट

.onDisappear एक SwiftUI मॉडिफायर है जो इंटरफ़ेस पदानुक्रम से View हटाए जाने पर क्लोज़र निष्पादित करता है। कॉल स्क्रीन बंद करने, टैब स्विच करने, मोडल विंडो खारिज करने या तत्व के दृश्य से बाहर स्क्रॉल होने पर होता है। Apple Developer Documentation (2026) के अनुसार, onDisappear क्रैश परिदृश्यों या सिस्टम वॉचडॉग द्वारा ऐप समाप्त होने पर कॉल की गारंटी नहीं देता। SwiftUI के बारे में अधिक जानकारी के लिए SwiftUI लेख देखें।

मुख्य बातें

  • .onDisappear — View के गायब होने पर कोड निष्पादित करने के लिए SwiftUI मॉडिफायर।
  • समरूपता — onDisappear onAppear के साथ युग्मित है और उल्टे क्रम में कॉल किया जाता है।
  • संसाधन सफाई — मुख्य परिदृश्य: टाइमर रद्द करना, कनेक्शन बंद करना, स्थिति सहेजना।
  • विश्लेषण — onDisappear के माध्यम से स्क्रीन क्लोज़, ड्वेल टाइम, सत्र समाप्ति इवेंट भेजे जाते हैं।
  • कोई गारंटी नहीं — ऐप क्रैश होने पर onDisappear कॉल नहीं होता।

.onDisappear क्या है?

.onDisappear SwiftUI में एक View मॉडिफायर है जो Void क्लोज़र लेता है और View को पदानुक्रम से हटाए जाने पर इसे निष्पादित करता है। .onAppear के साथ यह स्क्रीन का पूर्ण जीवनचक्र बनाता है: प्रकटन — कार्य — गायब होना। Apple ने onDisappear को SwiftUI के साथ iOS 13 में UIKit के viewDidDisappear के एनालॉग के रूप में पेश किया।

वाक्यात्मक रूप से, .onDisappear onAppear के समान है: यह किसी भी View को संशोधित करता है और एक क्लोज़र संलग्न करता है जिसे SwiftUI रेंडरर View हटाए जाने पर कॉल करता है। UIKit के विपरीत, जहाँ viewDidDisappear केवल संक्रमण एनिमेशन पूरा होने के बाद ही सक्रिय होता है, SwiftUI में onDisappear एनिमेशन समाप्त होने से पहले — View के हटाने के लिए चिह्नित होने के क्षण में कॉल किया जा सकता है।

onDisappear सिंटैक्स

मूल सिंटैक्स onDisappear का onAppear जितना ही संक्षिप्त है। मॉडिफायर कोई अतिरिक्त पैरामीटर नहीं लेता — केवल क्लोज़र, जो मुख्य थ्रेड पर सिंक्रोनस रूप से निष्पादित होता है।

swift
struct DetailView: View {
    var body: some View {
        Text("Detail Screen")
            .onDisappear {
                print("DetailView स्क्रीन से गायब हो गया")
            }
    }
}

.onDisappear कैसे काम करता है

कॉल तंत्र onDisappear onAppear के विपरीत है: चाइल्ड तत्व पहले onDisappear प्राप्त करते हैं, फिर पैरेंट। यह child-first नियम सुनिश्चित करता है कि पैरेंट के संसाधन मुक्त होने से पहले चाइल्ड संसाधन मुक्त हो जाएँ। यदि कोई चाइल्ड तत्व पैरेंट डेटा पर निर्भर है, तो उसे पैरेंट संदर्भ के बिना सही ढंग से समाप्त होने में सक्षम होना चाहिए।

SwiftUI onDisappear को तब कॉल करता है जब View रेंडर ग्राफ़ से हटा दिया जाता है। ट्रिगर में शामिल हैं: NavigationStack से pop, TabView स्विचिंग, मोडल डिसमिस (sheet/fullScreenCover), या सशर्त रूप से प्रदर्शित View (if/switch)। List और ScrollView में, onDisappear तब कॉल होता है जब सेल प्रीफ़ेच बफ़र से बाहर स्क्रॉल होती है।

Child-first कॉल क्रम

Child-first क्रम का अर्थ है कि यदि VStack में तीन चाइल्ड View हैं, तो onDisappear पहले प्रत्येक चाइल्ड के लिए उल्टे क्रम में कॉल होता है, फिर पैरेंट के लिए। यह उचित सफाई के लिए महत्वपूर्ण है: चाइल्ड टाइमर पैरेंट ViewModel द्वारा साझा संसाधन मुक्त करने से पहले रद्द हो जाते हैं।

swift
struct ParentView: View {
    var body: some View {
        VStack {
            ChildView(id: "A")
            ChildView(id: "B")
        }
        .onDisappear {
            print("Parent onDisappear — अंतिम")
        }
    }
}

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

कंसोल आउटपुट: Child B onDisappear, Child A onDisappear, Parent onDisappear — अंतिम। onAppear की तुलना में उल्टा क्रम सही सफाई श्रृंखला सुनिश्चित करता है।

.onDisappear कब कॉल किया जाता है

कॉल परिदृश्य onDisappear कंटेनर प्रकार पर निर्भर करते हैं। NavigationStack में, onDisappear pop-to-root, सामान्य pop-back या स्वाइप (interactivePopGestureRecognizer) द्वारा स्क्रीन खारिज करने पर सक्रिय होता है। TabView में, टैब स्विच करने से छिपे टैब के लिए onDisappear और दिखाए गए टैब के लिए onAppear कॉल होता है — दोनों मॉडिफायर लगभग एक साथ सक्रिय होते हैं।

Sheet और fullScreenCover में, onDisappear प्रोग्रामेटिक डिसमिस (@Environment(\.dismiss) के माध्यम से) या नीचे की ओर स्वाइप जेस्चर पर कॉल होता है। महत्वपूर्ण विवरण: यदि sheet खोला गया था लेकिन उपयोगकर्ता ने ऐप स्विच किया, तो onDisappear वास्तविक बंद होने तक कॉल नहीं होता।

परिदृश्यonDisappear कॉल होता हैनोट
NavigationStack में Popहाँएनिमेशन के तुरंत बाद
TabView टैब स्विचहाँवर्तमान टैब
Sheet डिसमिसहाँएनिमेशन पूरा होने से पहले
List में स्क्रॉलहाँसेल प्रीफ़ेच ज़ोन से बाहर
ऐप मिनिमाइज़ करनानहींकॉल की कोई गारंटी नहीं
क्रैश/watchdog killनहींकॉल नहीं होता

.onDisappear उदाहरण

मुख्य उपयोग मामले onDisappear के संसाधन सफाई, स्थिति सहेजना और ट्रैकिंग हैं। onAppear के विपरीत, onDisappear कार्य निकास पर निष्पादित होते हैं और डुप्लिकेशन जाँच की आवश्यकता नहीं होती क्योंकि View एक बार गायब होता है।

स्थिति सहेजना और टाइमर रद्द करना

स्थिति सहेजना onDisappear में विशेष रूप से फ़ॉर्म के लिए उपयोगी है जहाँ स्क्रीन छोड़ने पर डेटा सहेजा जाना चाहिए। स्क्रीन पर वापस लौटने पर लीक से बचने के लिए टाइमर और Combine सब्सक्रिप्शन onDisappear में रद्द किए जाते हैं।

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

टाइमर रद्द करना onDisappear में स्क्रीन बंद होने के बाद कोड निष्पादन को रोकता है। रद्द किए बिना, टाइमर @State को अपडेट करने का प्रयास कर सकता है जो अब वर्तमान View से संबंधित नहीं है, जिससे रनटाइम चेतावनी उत्पन्न होती है।

स्क्रीन पर समय ट्रैकिंग

स्क्रीन पर ठहराव अवधि एक क्लासिक ट्रैकिंग परिदृश्य है। onAppear में समय रिकॉर्ड करें, onDisappear में अंतर की गणना करें और सत्र अवधि के साथ एक विश्लेषण इवेंट भेजें।

swift
struct TrackedView: View {
    @State private var appearTime: Date?
    
    var body: some View {
        Text("Tracked Screen")
            .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 बनाम .onAppear — अंतर

मुख्य अंतर onDisappear और onAppear के बीच कॉल क्रम और निष्पादन गारंटी है। onAppear View को पदानुक्रम में जोड़े जाने पर कॉल होता है और पुनर्निर्माण पर फिर से कॉल हो सकता है। onDisappear हटाने पर कॉल होता है और केवल सामान्य बंद होने पर सक्रिय होने की गारंटी है, क्रैश परिदृश्यों में नहीं।

WWDC 2024 के अनुसार, Apple onDisappear को सफाई बिंदु के रूप में मानने की सलाह देता है, डेटा कमिट बिंदु के रूप में नहीं। महत्वपूर्ण डेटा (भुगतान, पंजीकरण) वास्तविक समय में सहेजा जाना चाहिए, न कि View गायब होने के क्षण में, क्योंकि ऐप मिनिमाइज़ होने पर onDisappear कॉल की गारंटी नहीं है।

विशेषता.onAppear.onDisappear
कॉल का क्षणView पदानुक्रम में जोड़ा गयाView पदानुक्रम से हटाया गया
क्रमParent-firstChild-first
गारंटीउच्चक्रैश पर नहीं
मुख्य कार्यप्रारंभिकरणसफाई
दोहरा कॉलView पुनर्निर्माण परप्रति गायब होना एक बार

अनुशंसा: onDisappear का उपयोग केवल गैर-महत्वपूर्ण सफाई और ट्रैकिंग के लिए करें। डेटा स्थिरता के लिए, AppDelegate में scenePhase या applicationWillTerminate सूचनाओं का उपयोग करें।

सामान्य उपयोग परिदृश्य

परिदृश्य 1: YouTube-जैसी प्लेबैक. वीडियो विवरण स्क्रीन पर, onDisappear UserDefaults में प्लेबैक स्थिति सहेजता है। पुनः खोलने पर, onAppear UserDefaults से स्थिति पुनर्स्थापित करता है, जिससे निरंतर देखने का अनुभव मिलता है।

परिदृश्य 2: Combine सब्सक्रिप्शन रद्द करना. यदि ViewModel Combine पब्लिशर्स का उपयोग करता है, तो onDisappear cancellable?.cancel() के माध्यम से सब्सक्रिप्शन रद्द करता है। यह स्क्रीन छोड़ने के बाद UI अपडेट को रोकता है, जो पेजिनेशन वाली सूचियों और खोज क्वेरी के लिए विशेष रूप से महत्वपूर्ण है।

परिदृश्य 3: WebSocket बंद करना. रीयल-टाइम कनेक्शन वाले ऐप्स (मैसेंजर, कोटेशन फ़ीड) में, onDisappear बैटरी और डेटा बचाने के लिए WebSocket कनेक्शन बंद करता है। स्क्रीन पर वापस लौटने पर onAppear में पुनः कनेक्शन होता है।

onDisappear में WebSocket बंद करना

WebSocket एक विशिष्ट संसाधन है जिसे स्क्रीन छोड़ने पर बंद करने की आवश्यकता होती है। नीचे दिए गए उदाहरण में, onDisappear सॉकेट को डिस्कनेक्ट करता है और onAppear इसे पुनः कनेक्ट करता है, जो कई स्क्रीन वाले ऐप्स के लिए महत्वपूर्ण डेटा बचत प्रदान करता है।

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

महत्वपूर्ण: TabView टैब के बीच स्विच करते समय, वर्तमान टैब का onDisappear और अगले टैब का onAppear लगभग एक साथ सक्रिय होते हैं। WebSocket के लिए यह डिस्कनेक्ट-कनेक्ट चक्र का कारण बन सकता है जो अनावश्यक लोड पैदा करता है। समाधान विलंब का उपयोग करना या जाँचना है कि क्या अगली स्क्रीन पर सॉकेट की आवश्यकता है।

अक्सर पूछे जाने वाले प्रश्न

क्या .onDisappear कॉल नहीं हो सकता?

हाँ, .onDisappear ऐप क्रैश (crash, watchdog kill), स्क्रीन बंद किए बिना ऐप मिनिमाइज़ करने या सिस्टम परिदृश्यों में जहाँ ऐप बैकग्राउंड में समाप्त हो जाता है, कॉल की गारंटी नहीं देता। महत्वपूर्ण डेटा के लिए scenePhase या applicationWillTerminate का उपयोग करें।

.onDisappear को .scenePhase से कैसे अलग करें?

.onDisappear View को पदानुक्रम से हटाए जाने पर सक्रिय होता है — एक विशिष्ट स्क्रीन के लिए स्थानीय कॉलबैक। .scenePhase (@Environment(\.scenePhase) के माध्यम से) संपूर्ण ऐप स्थिति बदलने पर सक्रिय होता है: active, inactive, background। स्क्रीन समय ट्रैकिंग के लिए onAppear+onDisappear का उपयोग करें और वैश्विक स्थिति स्थिरता के लिए scenePhase का।

.onDisappear एक पंक्ति में कई बार क्यों कॉल होता है?

कारण तीव्र टैब स्विचिंग या एक ही स्क्रीन का बार-बार push/pop है। SwiftUI एक नया View इंस्टेंस बना सकता है, पुराने को हटा सकता है, फिर से बना सकता है — हर बार onDisappear और onAppear कॉल करता है। जाँचें कि क्या आप .id(), .equatable() का उपयोग कर रहे हैं या पैरेंट body में View को पुनर्निर्मित कर रहे हैं।

क्या macOS पर SwiftUI में .onDisappear काम करता है?

हाँ, .onDisappear macOS (10.15+) पर समान व्यवहार के साथ पूरी तरह समर्थित है: विंडो बंद करने, split view पैनल हटाने या मोडल खारिज करने पर कॉल होता है। macOS पर, onDisappear विंडो छिपाने पर भी कॉल होता है (केवल बंद करने पर नहीं), जो macOS ऐप्स के लिए विचार करना महत्वपूर्ण है।

.onDisappear में URLSessionTask कैसे रद्द करें?

@State में URLSessionTask का संदर्भ सहेजें और onDisappear में task.cancel() कॉल करें। वैकल्पिक रूप से, .task मॉडिफायर का उपयोग करें जो View गायब होने पर स्वचालित रूप से async ऑपरेशन रद्द करता है। .task सभी async ऑपरेशनों के लिए प्राथमिकता है, URLSession सहित।

सारांश

  • .onDisappear — View गायब होने पर संसाधन सफाई और ट्रैकिंग के लिए onAppear का युग्मित मॉडिफायर।
  • Child-first क्रम — चाइल्ड View सही सफाई श्रृंखला के लिए पैरेंट से पहले onDisappear प्राप्त करते हैं।
  • कॉल की कोई गारंटी नहीं — क्रैश, मिनिमाइज़ या सिस्टम समाप्ति पर onDisappear सक्रिय नहीं हो सकता।
  • मुख्य उपयोग मामले — टाइमर रद्द करना, WebSocket बंद करना, स्थिति सहेजना, अवधि ट्रैकिंग।
  • विश्लेषण — onDisappear Date().timeIntervalSince के माध्यम से गणना की गई ठहराव अवधि के साथ screen_close इवेंट भेजता है।
  • async ऑपरेशन के लिए — Task {} के साथ onDisappear के बजाय .task का उपयोग करें क्योंकि .task स्वचालित रूप से अनुरोध रद्द करता है।

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें