बीच क्या अंतर है -[UIViewController viewWillAppear:]और -[UIViewController viewDidAppear:]?
बीच क्या अंतर है -[UIViewController viewWillAppear:]और -[UIViewController viewDidAppear:]?
जवाबों:
सामान्य तौर पर, यह वही है जो मैं करता हूं:
1) ViewDidLoad - जब भी मैं किसी दृश्य पर नियंत्रण जोड़ रहा हूँ, जो कि दृश्य के साथ एक साथ दिखाई दे, अभी, मैंने इसे ViewDidLoad विधि में रखा है। जब भी दृश्य को मेमोरी में लोड किया गया था, मूल रूप से इस पद्धति को कहा जाता है। उदाहरण के लिए, यदि मेरा दृश्य 3 लेबल के साथ एक रूप है, तो मैं यहां लेबल जोड़ूंगा; उन रूपों के बिना दृश्य कभी मौजूद नहीं होगा।
2) ViewWillAppear : मैं आमतौर पर फॉर्म पर डेटा को अपडेट करने के लिए ViewWillAppear का उपयोग करता हूं। इसलिए, ऊपर दिए गए उदाहरण के लिए, मैं इसका उपयोग वास्तव में अपने डोमेन से डेटा को फ़ॉर्म में लोड करने के लिए करूंगा। UIView का निर्माण काफी महंगा है, और आपको ViewWillAppear मेथड पर जितना संभव हो उतना करने से बचना चाहिए, जब यह कहा जाता है, तब बचे, इसका मतलब है कि iPhone पहले से ही उपयोगकर्ता को UIView दिखाने के लिए तैयार है, और कुछ भी जो आपको भारी पड़ता है। बहुत ही दृश्यमान तरीके से प्रदर्शन को प्रभावित करेगा (जैसे एनिमेशन में देरी हो रही है, आदि)।
3) ViewDidAppear : अंत में, मैं उन चीज़ों के लिए नए थ्रेड्स शुरू करने के लिए ViewDidAppear का उपयोग करता हूं, जिन्हें निष्पादित करने में लंबा समय लगेगा, जैसे कि ऊपर दिए गए फॉर्म के लिए अतिरिक्त डेटा प्राप्त करने के लिए एक webservice कॉल करना। अच्छी बात यह है कि क्योंकि दृश्य पहले से मौजूद है और उपयोगकर्ता के लिए प्रदर्शित किया जा रहा है, आप डेटा प्राप्त करते समय उपयोगकर्ता को एक अच्छा "प्रतीक्षा" संदेश दिखा सकते हैं।
viewWillAppear? आप नेटवर्क के माध्यम से डाउनलोड करने का मतलब है? लेकिन आप भी इसमें सामान डाउनलोड करने का सुझाव देते हैं viewDidAppear?
ViewDidAppearआसानी से यूआई के बारे में उपयोगकर्ता को भ्रमित करेंगे :)
viewDidLoad === >>> अपना इनिशियलाइज़ेशन कोड यहाँ डालें। डायनामिक डेटा न डालें जो दृश्य जीवनचक्र के दौरान बदल सकता है। इसलिए, यदि आप कोर डेटा से डेटा खींच रहे हैं, तो आप इसे यहां नहीं करना चाहते हैं अगर यह दृश्य के जीवन के दौरान बदल सकता है। उदाहरण के लिए: मान लें कि आपके पास एक टैब नियंत्रक है। आप टैब 1 से टैब 2 पर स्विच करते हैं और टैब 2 में मॉडल पर कुछ बदलते हैं। यदि आप टैब 1 पर वापस आते हैं और आपका मॉडल कोड viewDidLoad में किया गया था तो इसे अपडेट नहीं किया जाएगा (यह मानते हुए कि आप KVO या NSFetchedResultsController, आदि का उपयोग नहीं कर रहे हैं)।
viewWillAppear === >>> यह कहा जाता है कि हर बार दृश्य दिखाई देने वाला है, चाहे दृश्य पहले से ही स्मृति में है या नहीं। अपना डायनामिक कोड यहां रखें, जैसे कि मॉडल लॉजिक।
viewDidAppear === >>> महंगा ऑपरेशन यहां डालें जो आप तभी करना चाहते हैं जब आप सुनिश्चित करें कि व्यू ऑनस्क्रीन हो, जैसे कि नेटवर्क कॉल।
सूचना: यदि आपका ऐप बैकग्राउंड है और अग्रभूमि पर लौट आता है, तो आपको NSNotificationCenter का उपयोग करके इसे संभालना होगा। मैंने नीचे टिप्पणियों में उसके लिए कोड लिखा है। आपको लगता है कि viewWillAppear / viewDidAppear में आग लग जाएगी। वहां एक ब्रेक प्वाइंट रखें और इसका परीक्षण करें। यह आग नहीं है। इसलिए, यदि आपके ऐप के लिए कुछ बदल गया है जबकि यह पृष्ठभूमि में था तो आपको सूचनाओं का उपयोग करके अपडेट करना होगा।
viewWillAppearविधि वास्तविक दृश्य लोड करने से पहले कहा जाता है।
viewDidAppearजब दृश्य पहले से ही भरी हुई है विधि कहा जाता है, और आप कुछ दिखाना चाहते हैं।
viewWillAppear:
■ जिसे देखने से पहले कॉल किया जाता है, विंडोज़ के व्यू पदानुक्रम में जोड़ा
जाता है ■ जिसे [vc.view LayoutSubviews] से पहले कॉल किया जाता है (यदि आवश्यक हो)
viewDidAppear :
■ व्यू पदानुक्रम में व्यू में जोड़े जाने के
बाद कॉल किया जाता है ■ [vc.view LayoutSubviews] के बाद कॉल किया जाता है (यदि आवश्यक है)
कुछ अवलोकन:
viewDidLoadजब दृश्य पहले instantiated है विधि कहा जाता है। IBOutletइस समय को संदर्भित किया जाता है, लेकिन इससे पहले नहीं। frameदेखने का हालांकि, समय यह कहा गया है द्वारा स्थापित नहीं किया जा सकता है। यह सबव्यू और उनके संबंधित बाधाओं को जोड़ने / कॉन्फ़िगर करने के लिए एक शानदार जगह है। लेकिन यदि आप frameमुख्य दृश्य के आयामों के आधार पर मानों का कोई मैनुअल कॉन्फ़िगरेशन कर रहे हैं , तो उन फ़्रेमों के कॉन्फ़िगरेशन को तब तक के लिए स्थगित कर दिया जाना चाहिए viewWillAppearया viewDidLayoutSubviews।
viewWillAppearविधि कहा जाता है जब दृश्य पदानुक्रम में देखने की प्रस्तुति शुरू करने के लिए के बारे में है। विशेष रूप से, यह एनीमेशन की शुरुआत में कहा जाता है (यदि कोई हो) दृश्य की प्रस्तुति। इसका साथी, viewWillDisappearस्पष्ट रूप से कहा जाता है जब इस दृष्टिकोण से दूर संक्रमण शुरू होता है।
viewDidAppearजब दृश्य की प्रस्तुति से किया जाता है विधि कहा जाता है, विशेष रूप से जब किसी भी और सभी संबद्ध एनीमेशन समाप्त हो गया है। इसके साथी, viewDidDisappearस्पष्ट रूप से कहा जाता है जब इस दृश्य से दूर संक्रमण किया जाता है।
दो महत्वपूर्ण चेतावनी:
viewDidLoadएक बार और केवल एक बार बुलाया जाता है, जब दृश्य पहले त्वरित होता है। दूसरी ओर, viewWillAppearऔर viewDidAppearन केवल तब कहा जाएगा जब दृश्य पहली बार प्रस्तुत किया जाता है, लेकिन हर बाद के प्रश्न में उसी दृश्य को फिर से प्रस्तुत किया जाता है। उदाहरण के लिए, जब आप पहली बार एक दृश्य प्रस्तुत करते हैं, तो इन तीनों तरीकों को बुलाया जाएगा। यदि प्रश्न में दृश्य बाद में एक और दृश्य प्रस्तुत करता है जिसे बाद में खारिज कर दिया जाता है, viewWillAppearऔर viewDidAppearआम तौर पर फिर से बुलाया जाएगा जब प्रश्न में दृश्य जोड़ा जाता है और दृश्य पदानुक्रम में वापस एनिमेटेड होता है, लेकिन viewDidLoadनहीं होगा। viewDidLoadकेवल तभी कहा जाता है जब यह विशेष उदाहरण पहली बार बनाया गया हो।
तो, अगर आप कुछ हर बार एक दृश्य reappears (जैसे आप को खारिज या इसे करने के लिए वापस पॉप) करना चाहते हैं, उस में करना viewWillAppearया viewDidAppear। यदि आप चाहते हैं कि यह केवल तभी हो, जब दृश्य पहले त्वरित किया गया हो, तो ऐसा करें viewDidLoad।
कॉलिंग की viewWillAppearगारंटी नहीं है कि उस दृश्य में संक्रमण कभी पूरा हो जाएगा। विशेष रूप से, यदि आप इंटरैक्टिव संक्रमण का उपयोग कर रहे हैं जो वास्तविक समय उपयोगकर्ता इनपुट द्वारा संचालित हैं, लेकिन उस इंटरैक्टिव संक्रमण को रद्द किया जा सकता है। यानी, सिर्फ इसलिए viewWillAppearकहा जाता है, इसका मतलब यह नहीं है कि viewDidAppearबुलाया जाएगा। आम तौर पर यह होता है, लेकिन अगर इंटरेक्टिव जेस्चर रद्द हो जाता है, तो यह नहीं होगा (क्योंकि संक्रमण कभी समाप्त नहीं हुआ)।
WWDC 2013 में, इंटरैक्टिव बदलावों के संदर्भ में, एक प्रस्तुतकर्ता ने मजाक में कहा कि उन्हें viewWillAppear" viewMightAppear, या viewWillProbablyAppear, या iReallyWishThisViewWouldAppear" का नाम बदलना चाहिए ।
एक अंतर्निहित इंटरेक्टिव जेस्चर का एक उदाहरण है जब UINavigationControllerआप एक पॉप का उपयोग करने के लिए "और बाएं किनारे से स्वाइप करें" का उपयोग करते हैं। viewWillAppearदृश्य जो करने के लिए आप पॉपिंग कर रहे हैं के लिए बुलाया जाएगा, लेकिन अगर आपको लगता है कि "बाएं किनारे से स्वाइप" रद्द दृश्य जिसमें से आप इस पॉप इशारा शुरू करने के लिए वापस लौटने के लिए, पॉप रोक दी गई है और viewDidAppearदेखने के लिए आप शुरू कर दिया वापस पॉप कभी नहीं कहा जाएगा।
इसका शुद्ध प्रभाव यह है कि आपको सावधान रहना चाहिए कि आप ऐसा कोड न लिखें जो यह मानता हो कि हर कॉल के लिए कॉल करने के viewWillAppearबाद अंततः कॉल किया जाएगा viewDidAppear। यदि संक्रमण रद्द हो जाता है, तो यह मामला नहीं होगा।
1) ViewWillAppear : दृश्य को वास्तव में मेमोरी में लोड किया जाता है, जिसे व्यू कंट्रोलर में एक बार कॉल किया जाता है और इसका फ्रेम होता है, लेकिन फिर भी उपयोगकर्ता को दिखाई नहीं देता है
2) ViewDidAppear : नियंत्रक को पदानुक्रम में जोड़ा गया है, इसलिए आप अगले नियंत्रक को प्रस्तुत कर सकते हैं, यह भी, दृश्य ने लेआउट को लेआउट किया
पूर्व दिखाई देने से पहले होता है और बाद में होता है।
सारांश में:
-viewWillAppear -> अपडेट डेटा (तालिका दृश्य से डेटा पुनः लोड करें)
-viewDidAppear -> महंगे ऑपरेशन (एक अच्छी प्रगति के साथ एपीआई कॉल!)
Usecase , अर्थात मुझे कब उपयोग करना चाहिए?
viewDidLoad - जब लेबल, बटन (i, e किसी भी नियंत्रण / साक्षात्कार) दृश्य की इंटरफ़ेस फ़ाइल से जुड़े होते हैं और यदि आप एक ही समय में ViewController के दृश्य के रूप में लोड करना चाहते हैं, और यदि आप इसे एक बार मेमोरी में लोड करना चाहते हैं और इसके साथ किया
viewWillAppear- कहते हैं, आप हर बार दृश्य का बैकग्राउंड रंग बदलना चाहते हैं, स्क्रीन पर व्यूकंट्रोलर दिखाई देता है। या अधिक वास्तविक रूप से यदि आप दिन के रात के समय में DarkMode पृष्ठभूमि रंग चाहते हैं, और दिन के समय पृष्ठभूमि दृश्य का हल्का रंग, इस कोड के लिए जाएंviewWillAppear
एक और अच्छा usecase यहाँ https://stackoverflow.com/a/39395865/5438240
यह भी ध्यान दें कि, यदि आप एक नेविगेशन स्टैक ( UINavigationController) का उपयोग कर रहे हैं , तो व्यूपोन्स्टर जो पॉपअप होने वाला है, viewWillDisappear()उसे कॉल किया जाता है, और व्यूकंट्रोलर जो अगले स्टैक के शीर्ष पर होगा, viewWillAppear()उसने कॉल किया होगा