viewWillDisappear UIViewController का एक मेथड है जिसे UIKit स्क्रीन के यूजर के डिस्प्ले से गायब होने से ठीक पहले कॉल करता है। Apple Developer Documentation के अनुसार, यह मेथड animated पैरामीटर प्राप्त करता है और push, pop, present, dismiss और टैब बदलने पर ट्रिगर होता है। viewWillDisappear स्थिति को सहेजने और संसाधनों को सही ढंग से मुक्त करने की प्रमुख जगह है।
मुख्य बातें
viewWillDisappear UIViewController का एक मेथड है जिसे UIKit नियंत्रक का दृश्य स्क्रीन से गायब होने से ठीक पहले कॉल करता है। इस क्षण स्क्रीन अभी भी यूजर को दिखाई दे रही है, लेकिन संक्रमण शुरू हो चुका है: NavigationController ने push/pop एनिमेशन शुरू कर दिया है, मोडल व्यू बंद होने लगी है, या TabBar ने किसी और टैब पर स्विच करना शुरू कर दिया है। डिवेलपर इस मेथड को उन कार्यों के लिए ओवरराइड करता है जिनके लिए स्क्रीन का अभी भी पहुँच योग्य होना आवश्यक है लेकिन छुपने की तैयारी है।
viewDidDisappear के विपरीत, जो स्क्रीन छुपने के बाद ट्रिगर होता है, viewWillDisappear डेटा सहेजने और संसाधन जारी करने का आखिरी अवसर प्रदान करता है जबकि यूजर इंटरफ़ेस देख सकता है। यह UX के लिए अत्यंत महत्वपूर्ण है — ड्राफ्ट सहेजना या टाइमर रोकना यूजर के दूसरी स्क्रीन पर स्विच करने से पहले होना चाहिए।
यह मेथड animated पैरामीटर स्वीकार करता है, जो इंदिकाट करता है कि गायबी एनिमेटेड है या नहीं। true का अर्थ है कि UIKit एनिमेटेड ट्रांजिशन कर रहा है, false का अर्थ है कि स्क्रीन तुरंत गायब हो जाती है, उदाहरण के लिए बिना एनिमेशन के dismiss या प्रोग्रामेटिक रूप से अनुक्रम से हटाने पर।
viewWillDisappear उन सभी परिदृश्यों में कॉल होता है जहाँ वर्तमान स्क्रीन सक्रिय होना बंद कर देती है। iOS डिवेलपमेंट के लिए विशिष्ट मुख्य मामलों की समीक्षा करें।
जब UINavigationController किसी नए नियंत्रक का push करता है, तो संक्रमण एनिमेशन की शुरुआत पर वर्तमान पर viewWillDisappear कॉल होता है। इस क्षण वर्तमान स्क्रीन उसके ओपर स्लाइड कर रहे नए नियंत्रक के नीचे अभी भी दिखाई दे रही है। यह मानक परिदृश्य है जहाँ viewWillDisappear animated = true के साथ ट्रिगर होता है।
जब यूजर बैक बटन दबाता है या इंटरैक्टिव स्वाइप बैक करता है, तो वर्तमान नियंत्रक पर viewWillDisappear कॉल होता है। इंटरैक्टिव जेस्चर के साथ यह कॉल रद्द किया जा सकता है यदि यूजर अपना मन बदलता है और स्क्रीन को अपनी जगह पर लौटा देता है। स्थिति सहेजन डिजाइन करते समय यह एक महत्वपूर्ण विशेषता है जिसे ध्यान में रखना चाहिए।
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
saveDraftData()
NotificationCenter.default.removeObserver(self)
}
मोडल व्यू बंद करते समय, dismiss एनिमेशन की शुरुआत पर बंद होने वाले नियंत्रक पर viewWillDisappear कॉल होता है। इस बिंदु पर आप डिलीगेट या क्लोजर के माध्यम से परिणाम वापस भेज सकते हैं, क्योंकि जिस नियंत्रक ने मोडल प्रस्तुत किया था उसे अभी नियंत्रण नहीं मिला है।
UITabBarController यूजर द्वारा किसी और टैब को छूने के तुरंत बाद छोड़ी जा रही टैब के नियंत्रक पर viewWillDisappear कॉल करता है। यदि वर्तमान टैब पर सक्रिय प्रक्रियाएँ हैं — मीडिया प्लेबैक, फ़ाइल डाउनलोड, टाइमर — तो उन्हें यहाँ रोका या रुकवा जाना चाहिए।
viewWillDisappear संसाधन और स्थिति प्रबंधन से संबंधित विशिष्ट कार्यों को हल करता है। कोड उदाहरणों के साथ मुख्य परिदृश्यों की समीक्षा करें।
viewWillDisappear का सबसे महत्वपूर्ण कार्य वर्तमान स्क्रीन पर यूजर द्वारा दर्ज या संशोधित डेटा को सहेजना है। संदेश ड्राफ्ट, संपादित फ़ॉर्म फ़ील्ड, चयनित सेटिंग्स — यह सब स्क्रीन गायब होने से पहले सहेज किया जाना चाहिए। पर्सिस्टेंस के लिए Core Data, UserDefaults या फ़ाइल स्टोरेज का उपयोग करें।
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
guard hasUnsavedChanges else { return }
draftStorage.save(currentDraft)
}
NotificationCenter, KVO और Combine पब्लिशर जिनकी आपने viewWillAppear या viewDidLoad में सदस्यता ली थी, उन्हें viewWillDisappear में रद्द कर दिया जाना चाहिए। ऐसा न करने पर, अधिसूचनाएँ छुपी हुई स्क्रीन पर आएँगी, जिससे UI अपडेट होंगे जो यूजर नहीं देखता, या — इससे भी बुरा — पहले से डीआलोकेट किए गए ऑब्जेक्ट तक पहुँचने से क्रैश होगा।
viewDidAppear में शुरू की गई UIView एनिमेशन और Timer या DispatchSource के माध्यम से चल रहे टाइमर को viewWillDisappear में रोकना चाहिए। छुपी हुई स्क्रीन पर जारी एनिमेशन यूजर के लिए बिना किसी लाभ के GPU और बैटरी बरबाद करती हैं। टाइमर पर invalidate और लेयर पर removeAllAnimations कॉल करके उन्हें स्पष्ट रूप से रोकें।
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
countdownTimer?.invalidate()
countdownTimer = nil
loadingIndicator.layer.removeAllAnimations()
}
यदि कोई नियंत्रक परिणाम प्राप्त करने के लिए खोला गया था — एक आइटम चुनना, टेक्स्ट दर्ज करना, कार्रवाई की पुष्टि करना — viewWillDisappear आखिरी क्षण है जब मूल नियंत्रक स्टैक में मौजूद होता है और डेटा प्राप्त कर सकता है। deinit कॉल होने से पहले डिलीगेट या क्लोजर को कॉल करें।
विश्वसनीय स्थिति सहेजन iOS डिवेलपमेंट में सबसे चुनौतीपूर्ण कार्यों में से एक है। viewWillDisappear रणनीति का एक महत्वपूर्ण लेकिन एकमात्र तत्व नहीं है। आइए एक व्यापक दृष्टिकोण देखें।
स्तर 1 — viewWillDisappear में सहेजना। हल्के डेटा का त्वरित सहेजन जो लौटने पर तुरंत उपलब्ध होना चाहिए। UI स्थिति के लिए उपयुक्त: स्क्रोल स्थिति, चयनित सेगमेंट, इनपुट फ़ील्ड में टेक्स्ट। समस्या: रद्द किए गए इंटरैक्टिव pop जेस्चर पर, सहेजन होता है भले ही यूजर स्क्रीन पर रहा हो — डेटा अनावश्यक रूप से ओवरराइटेन हो जाता है।
स्तर 2 — viewDidDisappear में सहेजना। पहले स्तर से सहेजन को डप्लिकेट करता है लेकिन केवल स्क्रीन के गारंटीड छुपने के बाद ही ट्रिगर होता है। यह रद्द किए गए जेस्चरों के खिलाफ एक सुरक्षा है। हालाँकि, यदि आपने viewWillDisappear में अधिसूचनाओं से सदस्यता समाप्त कर दी है, तो viewDidDisappear की कुछ डेटा तक पहुँच नहीं हो सकती है।
स्तर 3 — एप्लिकेशन अधिसूचनाओं के माध्यम से सहेजन। UIApplication.willResignActiveNotification और UIApplication.didEnterBackgroundNotification ऐप बैकग्रंड होने को पकड़ते हैं। यदि यूजर ने ऐप को छोटा किया, तो viewWillDisappear कॉल नहीं हुआ होगा — लेकिन इन अधिसूचनाओं के माध्यम से सहेजन गारंटी देता है कि सत्र के अंत में डेटा अखंड रहेगा।
| स्तर | विधि/अधिसूचना | विश्वसनीयता | उपयोग |
|---|---|---|---|
| 1 | viewWillDisappear | उच्च | UI स्थिति, ड्राफ्ट |
| 2 | viewDidDisappear | बहुत उच्च | महत्वपूर्ण डेटा |
| 3 | willResignActive | अधिकतम | ऐप बैकग्रंड होने पर |
अनुशंसा: महत्वपूर्ण यूजर डेटा के लिए तीनों स्तरों का संयोजन उपयोग करें। गैर-महत्वपूर्ण स्थिति के लिए पहला स्तर पर्याप्त है। एक ही डेटा को बार-बार सहेजने से बचने के लिए dirty फ़्लैग का उपयोग करें जो दर्शाता है कि पिछले सहेजन के बाद डेटा बदल गया है।
CRUD स्क्रीन के लिए विशेष ध्यान दिया जाना चाहिए जहाँ यूजर डेटा दर्ज करता है। ऑसी स्क्रीन पर viewWillDisappear में हर कीस्ट्रोक को सहेजना अनुशंसित नहीं है — यह अतिरिक्त है। Timer के माध्यम से विलंब (debounce) के साथ ऑटो-सेव का उपयोग करें, और viewWillDisappear का उपयोग केवल अंतिम अनिवार्य सहेजन के लिए करें यदि असहेजित परिवर्तन हैं। यह दृष्टिकोण प्रदर्शन और डेटा अखंडता के बीच संतुलन बनाता है।
Core Data का उपयोग करने वाले ऐप के लिए, एक अतिरिक्त उपाय यह है कि viewWillDisappear में saveContext को केवल तब कॉल करें जब managed object context में वास्तविक परिवर्तन हों। सहेजन से पहले context.hasChanges की जाँच करना persistent store में अनावश्यक लेखन को रोकता है और डिवाइस की बैटरी लाइफ को बढ़ाता है। इस जाँच को applicationDidEnterBackground में ग्लोबल सेविंग के साथ संयोजित करें।
गलत उपयोग viewWillDisappear के कारण डेटा हानि, मेमोरी लीक और अस्थिर एप व्यवहार हो सकता है। आइए सामान्य iOS डिवेलपर गलतियों की समीक्षा करें।
पहली गलती — केवल viewWillDisappear में डेटा सहेजना। जैसा कि ऊपर चर्चा की गई, इंटरैक्टिव pop जेस्चर के साथ यह मेथड कॉल होता है भले ही स्क्रीन गायब न हुई हो। यदि सहेजन के दुष्प्रभाव हैं — सर्वर पर डेटा भेजना, स्थिति बदलना — तो यह झूठे ट्रिगर का कारण बन सकता है। isBeingDismissed या isMovingFromParent की जाँच जोड़ें।
दूसरी गलती — NotificationCenter से सदस्यता समाप्त न करना। iOS में यह सबसे आम मेमोरी लीक में से एक है। यदि आपने viewWillAppear में UIResponder.keyboardWillShowNotification की सदस्यता ली लेकिन viewWillDisappear में सदस्यता समाप्त नहीं की, तो क्लोजर कॉल होता रहेगा। नियंत्रक के deinit पर, क्लोजर एक डीआलोकेट ऑब्जेक्ट का संदर्भ देगा — ऐप क्रैश निश्चित।
तीसरी गलती — भारी सिंक्रोनस ऑपरेशन करना। viewWillDisappear में बड़ी मात्रा में डेटा सहेजना, Core Data या फ़ाइल सिस्टम में लिखना मुख्य थ्रेड को ब्लॉक करता है। यदि ऑपरेशन ट्रांजिशन एनिमेशन से अधिक समय लेता है, तो UIKit थ्रेड को रोक देता है और इंटरफ़ेस फ्रीज़ हो जाता है। भारी सहेजन को बैकग्रंड क्यू में डालें।
चौथी गलती — super कॉल करना भूलना। super.viewWillDisappear को न बुलाने से UINavigationController और UITabBarController टूट सकते हैं जो अपनी आंतरिक स्थितियों के लिए इस मेथड का उपयोग करते हैं। Apple दस्तावेज़ का पालन करते हुए हमेशा super को पहले या अंत में कॉल करें।
यह समस्या सक्रिय मल्टीटास्किंग और ऐप स्विचिंग वाले iOS पर और बढ़ जाती है। पाँचवीं गलती — viewWillDisappear में सहेजन के बाद DispatchQueue.main.async का उपयोग करना। यदि आप super.viewWillDisappear कॉल करने के बाद मुख्य क्यू में एक ब्लॉक असिंक्रोनस भेजते हैं, तो कोई गारंटी नहीं है कि ब्लॉक के निष्पादन तक नियंत्रक अभी भी मौजूद है। डीआलोकेट मेमोरी तक पहुँचने और एप क्रैश से बचने के लिए क्लोजर के अंदर हमेशा कमजोर संदर्भ [weak self] का उपयोग करें।
अक्सर पूछे जाने वाले प्रश्न
viewWillDisappear गायबी की शुरुआत में कॉल होता है जब स्क्रीन अभी भी दिखाई दे रही होती है। viewDidDisappear स्क्रीन के पूरी तरह छुप जाने और एनिमेशन पूरा होने के बाद कॉल होता है।
सहेजन की पुष्टि के लिए viewDidDisappear का उपयोग करें या viewWillDisappear के अंदर isMovingFromParent और isBeingDismissed प्रोपर्टी की जाँच करें कि स्क्रीन वास्तव में गायब होगी या नहीं।
हाँ, निश्चित रूप से यदि आप self के साथ ब्लॉक या सेलेक्टर का उपयोग करते हैं। ARC NotificationCenter सदस्यताओं का प्रबंधन नहीं करता है। iOS 9+ में ब्लॉक के लिए कमजोर संदर्भ का उपयोग करें और viewWillDisappear में सदस्यता समाप्त करें।
कोई तरीका नहीं — force quit जीवन चक्र के तरीकों को कॉल नहीं करता है। एप समाप्ति पर गारंटीड सहेजन के लिए UIApplication.willTerminateNotification का उपयोग करें या डेटा को बदलने पर रियल टाइम सहेजें।
हाँ, इंटरैक्टिव pop जेस्चर पर UIKit जेस्चर शुरू होने के तुरंत बाद viewWillDisappear को कॉल करता है। यदि यूजर जेस्चर को रद्द करता है, तो स्क्रीन दिखाई देती रहती है लेकिन मेथड पहले ही चल चुका होता है। हमेशा isMovingFromParent की जाँच करें।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें