viewWillAppear एक UIViewController विधि है जिसे UIKit हर बार स्क्रीन के उपयोगकर्ता को दिखाई देने से पहले कॉल करता है। Apple डेवलपर दस्तावेज़ीकरण के अनुसार, यह विधि एक बूलियन पैरामीटर animated प्राप्त करती है जो इंगित करता है कि संक्रमण एनिमेशन के साथ होता है या नहीं। viewWillAppear डेटा अपडेट करने और स्क्रीन की स्थिति को सिंक्रनाइज़ करने का मुख्य स्थान है।
मुख्य बिंदु
viewWillAppear एक UIViewController विधि है जिसे UIKit विंडो पदानुक्रम में View जोड़ने से तुरंत पहले कॉल करता है। इस बिंदु पर, View के पास Auto Layout पास के बाद अपने अंतिम आयाम होते हैं, लेकिन यह अभी तक उपयोगकर्ता को दिखाई नहीं देता है — संक्रमण एनिमेशन या तो शुरू नहीं हुआ है या प्रगति पर है। डेवलपर इस विधि को ओवरराइड करता है उन कार्यों को करने के लिए जो स्क्रीन के प्रत्येक प्रदर्शन से पहले होने चाहिए।
viewDidLoad के विपरीत जो केवल एक बार सक्रिय होता है, viewWillAppear हर बार कॉल किया जाता है जब स्क्रीन प्रकट होने वाली होती है: प्रारंभिक खोलने पर, चाइल्ड कंट्रोलर से वापस आने पर, मोडल विंडो बंद करने के बाद, और TabBar टैब स्विच करते समय। यह इसे इंटरफ़ेस स्थिति को अद्यतित रखने के लिए एक महत्वपूर्ण विधि बनाता है।
विधि Bool प्रकार का एक animated पैरामीटर स्वीकार करती है, जो true होता है यदि स्क्रीन प्रकटन एनिमेशन के साथ होता है। यह पैरामीटर NavigationBar और TabBar विधियों को पास करने के लिए सुविधाजनक है, जिनमें सुसंगत व्यवहार के लिए समान पैरामीटर होता है।
viewWillAppear कॉल का समय नेविगेशन प्रकार पर निर्भर करता है, लेकिन सामान्य नियम अपरिवर्तित रहता है: विधि View के दृश्य होने से पहले सक्रिय होती है। आइए मुख्य परिदृश्यों पर विचार करें।
viewDidLoad के बाद, UIKit प्रदर्शन की तैयारी शुरू करता है: View को पदानुक्रम में जोड़ा जाता है, layout पास ट्रिगर किए जाते हैं, और संक्रमण एनिमेशन शुरू होने से तुरंत पहले, viewWillAppear कॉल किया जाता है। इस समय, स्क्रीन अभी तक दृश्य नहीं है, लेकिन सभी सबव्यू के सही आकार हैं, और उनकी सामग्री को सुरक्षित रूप से अपडेट किया जा सकता है।
जब उपयोगकर्ता बैक बटन दबाता है या प्रोग्रामेटिक रूप से popViewController कॉल करता है, UIKit पिछली स्क्रीन पर लौटता है और उसका viewWillAppear कॉल करता है। यह viewWillAppear का मुख्य परिदृश्य है — आइटम जोड़ने के बाद सूची अपडेट करना या सेटिंग्स सिंक्रनाइज़ करना।
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tableView.reloadData()
updateBadgeCount()
}
मोडली प्रस्तुत कंट्रोलर को बंद करने के बाद, UIKit उस कंट्रोलर पर viewWillAppear कॉल करता है जिसने इसे प्रस्तुत किया था। यह परिदृश्य विशेष ध्यान देने की आवश्यकता है यदि आप डेटा वापस भेजने के लिए डेलिगेट या क्लोज़र का उपयोग करते हैं — viewWillAppear सुनिश्चित करता है कि परिणाम प्राप्त करने के बाद स्क्रीन अपडेट हो।
TabBarController हर बार स्विच होने पर चयनित टैब के कंट्रोलर पर viewWillAppear कॉल करता है। यदि टैब गतिशील डेटा प्रदर्शित करता है — विनिमय दरें, सूचनाएं, उपयोगकर्ता स्थिति — viewWillAppear उन्हें अपडेट करने के लिए आदर्श स्थान है।
viewWillAppear कई विशिष्ट कार्यों को हल करता है जो अन्य विधियों में करना असंभव या अप्रभावी है। आइए मुख्य कार्यों पर नज़र डालें।
viewWillAppear का सबसे सामान्य उपयोग स्क्रीन के हर बार प्रकट होने पर UITableView या UICollectionView को रीलोड करना है। यदि पिछली स्क्रीन पर डेटा बदल गया हो (आइटम जोड़ा गया, स्थिति बदली गई), तो viewWillAppear में reloadData कॉल करना सुनिश्चित करता है कि उपयोगकर्ता अद्यतित जानकारी देखे।
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
viewModel.synchronize()
tableView.reloadData()
}
viewWillAppear में NavigationBar का स्वरूप कॉन्फ़िगर करना सुविधाजनक है: इसे छिपाना या दिखाना, इसका रंग बदलना, बड़ा शीर्षक सेट करना। यदि विभिन्न स्क्रीन पर NavigationBar की अलग-अलग शैलियाँ हैं, तो viewWillAppear इन परिवर्तनों के लिए सही स्थान है, क्योंकि viewDidLoad केवल एक बार कॉल किया जाता है।
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.setNavigationBarHidden(
false, animated: animated
)
navigationController?.navigationBar.prefersLargeTitles = true
tabBarController?.tabBar.isHidden = false
}
ऐसी सूचनाएँ जो केवल तब समझ में आती हैं जब स्क्रीन दृश्य हो — कीबोर्ड सूचनाएँ, सामग्री परिवर्तन सूचनाएँ — viewWillAppear में सब्सक्राइब की जाती हैं और viewDidDisappear में अनसब्सक्राइब की जाती हैं। यह स्क्रीन के सक्रिय न होने पर अनावश्यक हैंडलर को रोकता है और मेमोरी लीक से बचाता है।
यदि स्क्रीन ऐप द्वारा छिपाई या छोटी की जा सकती है, तो viewWillAppear UI स्थिति को पुनर्स्थापित करने के लिए एक सुविधाजनक स्थान है: सेगमेंट स्विच करना, स्क्रॉल स्थिति पुनर्स्थापित करना, अस्थायी परिवर्तन रीसेट करना। उपयोगकर्ता हर बार प्रकट होने पर स्क्रीन को पूर्वानुमानित स्थिति में प्राप्त करता है।
अपठित संदेशों, रेटिंग्स या सूचनाओं के काउंटर प्रदर्शित करने वाली स्क्रीन पर, viewWillAppear उन्हें अपडेट करने का सही स्थान है। यदि उपयोगकर्ता किसी अन्य स्क्रीन पर मात्रा बदल सकता था, तो यहाँ पुनर्गणना और UITabBarItem.badgeValue या कस्टम संकेतकों का अपडेट कॉल किया जाता है। यह सुनिश्चित करता है कि उपयोगकर्ता हमेशा वर्तमान संख्याएँ देखे भले ही वह अन्य स्क्रीन पर कितने समय तक रहा हो।
collectionView के साथ काम करने पर विशेष ध्यान दिया जाना चाहिए: यदि स्क्रीन पर डेटा काउंटर या स्थितियों वाले सेल के ग्रिड के रूप में प्रस्तुत किया जाता है, तो viewWillAppear में उनका अपडेट चयनात्मक होना चाहिए। पूर्ण reloadData के बजाय, दृश्य सेल के लिए reloadItemsAtIndexPaths का उपयोग करें ताकि झिलमिलाहट और स्क्रॉल स्थिति के नुकसान से बचा जा सके।
viewWillAppear और viewDidLoad के बीच अंतर को समझना उचित UIViewController आर्किटेक्चर की नींव है। इन विधियों की कॉल आवृत्ति, संदर्भ और उद्देश्य अलग-अलग हैं।
viewDidLoad एक बार कॉल किया जाता है और उस कॉन्फ़िगरेशन के लिए उपयुक्त है जो समय के साथ नहीं बदलता: सेल पंजीकृत करना, डेलिगेट सेट करना, स्थिरांक आरंभ करना। viewWillAppear प्रत्येक प्रकटन पर कॉल किया जाता है और उन कार्यों के लिए उपयुक्त है जिन्हें दोहराने की आवश्यकता है: डेटा अपडेट करना, दृश्य तत्वों को कॉन्फ़िगर करना, स्थिति सिंक्रनाइज़ करना।
| विशेषता | viewDidLoad | viewWillAppear |
|---|---|---|
| आवृत्ति | एक बार | प्रकटन पर हर बार |
| View दृश्य | नहीं | नहीं (जल्द ही दृश्य होगा) |
| View आयाम | अंतिम नहीं | अंतिम |
| उपयुक्त है | एक बार की सेटअप | अपडेट और सिंक्रनाइज़ेशन |
| एनिमेशन | लागू नहीं | animated पैरामीटर |
सुनहरा नियम: यदि कोई कार्य केवल एक बार निष्पादित होना चाहिए — उसे viewDidLoad में रखें। यदि हर बार स्क्रीन पर वापस आने पर निष्पादित होना चाहिए — उसे viewWillAppear में रखें।
गलत उपयोग viewWillAppear के प्रदर्शन समस्याओं, अत्यधिक अपडेट और असंगत इंटरफ़ेस स्थिति का कारण बन सकता है। आइए सबसे सामान्य गलतियों पर नज़र डालें।
पहली गलती — viewDidLoad से तर्क का दोहराव। यदि आप viewDidLoad और viewWillAppear दोनों में टेबल सेल पंजीकृत करते हैं, तो पंजीकरण कई बार निष्पादित होगा, जबकि एक बार की सेटअप पर्याप्त है। सभी एक बार के कॉन्फ़िगरेशन को viewDidLoad में ले जाएँ।
दूसरी गलती — हर प्रकटन पर बिना शर्त reloadData। यदि डेटा नहीं बदला है, तो तालिका को रीलोड करने से डेटा स्रोत से अनावश्यक क्वेरी और सेल पुनः चित्रण होता है, जिससे प्रदर्शन कम होता है। reloadData कॉल करने से पहले जाँचें कि क्या स्थिति वास्तव में बदली है।
तीसरी गलती — यह ध्यान दिए बिना नेटवर्क अनुरोधों के साथ काम करना कि अनुरोध पूरा होने से पहले स्क्रीन फिर से छिपाई जा सकती है। यदि आप viewWillAppear में URLSession अनुरोध शुरू करते हैं और उपयोगकर्ता तुरंत दूसरी स्क्रीन पर चला जाता है, तो परिणाम पहले से छिपे View पर लागू हो सकता है। अपडेट करने से पहले रद्द करने योग्य कार्यों का उपयोग करें या isViewLoaded और window जाँचें।
चौथी गलती — super कॉल करना भूल जाना। super.viewWillAppear कॉल न करना पैरेंट कंट्रोलर (UINavigationController, UITabBarController) के व्यवहार को तोड़ सकता है और जेस्चर और ट्रांज़िशन की गलत हैंडलिंग का कारण बन सकता है। super हमेशा कॉल किया जाना चाहिए।
पाँचवीं गलती — layoutIfNeeded कॉल किए बिना constraints बदलना। यदि आप viewWillAppear में प्रोग्रामेटिक रूप से constraints बदलते हैं, तो UIKit उन्हें तुरंत लागू नहीं करता — परिवर्तन अगले layout पास तक जमा होते हैं। constraints बदलने के बाद परिवर्तनों के तत्काल अनुप्रयोग के लिए, view.layoutIfNeeded() कॉल करें। यह विशेष रूप से सामग्री-निर्भर तत्वों की ऊँचाई समायोजित करते समय महत्वपूर्ण है।
छठी गलती — viewWillAppear में एनिमेशन निष्पादित करने का प्रयास। जैसा कि ऊपर उल्लेख किया गया है, UIKit अभी भी संक्रमण एनिमेशन संसाधित कर रहा है, और आपका एनिमेशन सिस्टम एनिमेशन के साथ प्रतिस्पर्धा कर सकता है। यदि आपको किसी तत्व को प्रभाव के साथ प्रकट करने की आवश्यकता है, तो viewDidAppear में इनकमिंग एनिमेशन का उपयोग करें, और viewWillAppear में केवल प्रारंभिक स्थिति कॉन्फ़िगर करें: पारदर्शिता 0, स्केल 0.8 पर transform, इत्यादि।
सातवीं गलती — animated पैरामीटर को अनदेखा करना। कुछ डेवलपर viewWillAppear में animated मान की जाँच नहीं करते और ऐसे कार्य करते हैं जो एनिमेशन की उपस्थिति पर निर्भर होने चाहिए। उदाहरण के लिए, NavigationBar को animated = false होने पर बिना एनिमेशन के छिपाया जा सकता है, और animated = true होने पर — एनिमेशन के साथ, ताकि संक्रमण सहज दिखे। हमेशा animated पैरामीटर को उपयुक्त UIKit विधियों में पास करें।
आठवीं गलती — स्क्रीन के दृश्य न होने पर UI संशोधित करना। यदि आप viewWillAppear में नेटवर्क अनुरोध शुरू करते हैं और इसका completion block UI को अपडेट करता है जब स्क्रीन पहले ही गायब हो चुकी है, तो उपयोगकर्ता झिलमिलाहट या असंगत स्थिति देखेगा। क्लोज़र में UI अपडेट करने से पहले हमेशा isViewLoaded और window जाँचें। यह सरल कार्रवाई क्रैश और अनावश्यक इंटरफ़ेस पुनः चित्रण को रोकती है।
अक्सर पूछे जाने वाले प्रश्न
viewWillAppear प्रकटन एनिमेशन शुरू होने से पहले कॉल किया जाता है, जब View अभी तक दृश्य नहीं है। viewDidAppear एनिमेशन पूरा होने के बाद कॉल किया जाता है, जब स्क्रीन पूरी तरह प्रदर्शित होती है और इंटरैक्शन के लिए उपलब्ध होती है।
सामान्य परिस्थितियों में, स्क्रीन प्रकट होने पर viewWillAppear हमेशा कॉल होता है। अपवाद ऐप का फोर्स क्विट है, जिसमें UIKit के पास Lifecycle विधियों को कॉल करने का समय नहीं होता।
हाँ, निश्चित रूप से। UIKit इस कॉल का उपयोग UINavigationController और UITabBarController के साथ आंतरिक समन्वय के लिए करता है। super के बिना, जेस्चर और संक्रमण एनिमेशन टूट सकते हैं।
हर टैब स्विच पर। UIKit चयनित टैब के कंट्रोलर पर viewWillAppear कॉल करता है जैसे ही उपयोगकर्ता TabBar में संबंधित आइकन को छूता है।
कंट्रोलर गुणों या साझा डेटा स्रोत का उपयोग करें। popViewController कॉल करने से पहले, पिछले कंट्रोलर पर आवश्यक मान सेट करें, और वे उसके viewWillAppear में पहले से उपलब्ध होंगे।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें