-WillAppear: और -viewDidAppear :? के बीच क्या अंतर है


131

बीच क्या अंतर है -[UIViewController viewWillAppear:]और -[UIViewController viewDidAppear:]?


1
धन्यवाद बोल्टकॉक, लेकिन कृपया मुझे दोनों का उदाहरण दें यदि संभव हो ..
PJR

3
@BoltClock अगर यह सच होता तो अच्छा होता। मैं उन 15 लोगों का अनुमान लगा रहा हूं जिन्होंने अपवित्र तरीके से नाम पढ़ा, लेकिन वास्तव में इसे कभी नहीं मापा ... Google से यहां आए क्योंकि उनके बीच अंतर नहीं है
एडम

1
विशेष रूप से: parentView.viewDidAppear को Apple के पहले एक वास्तविक समय कहा जाता है, वास्तव में parentView प्रदर्शित करता है ... Apple पहले (atomically) सभी साक्षात्कारों को पेंट करता है ... और यदि आपके पास बहुत सारे साक्षात्कार हैं, या जटिल हैं, तो "viewididAppear" को दसियों कहा जा सकता है या सैकड़ों मिलीसेकंड भी जल्द ही :(।
एडम

जवाबों:


292

सामान्य तौर पर, यह वही है जो मैं करता हूं:

1) ViewDidLoad - जब भी मैं किसी दृश्य पर नियंत्रण जोड़ रहा हूँ, जो कि दृश्य के साथ एक साथ दिखाई दे, अभी, मैंने इसे ViewDidLoad विधि में रखा है। जब भी दृश्य को मेमोरी में लोड किया गया था, मूल रूप से इस पद्धति को कहा जाता है। उदाहरण के लिए, यदि मेरा दृश्य 3 लेबल के साथ एक रूप है, तो मैं यहां लेबल जोड़ूंगा; उन रूपों के बिना दृश्य कभी मौजूद नहीं होगा।

2) ViewWillAppear : मैं आमतौर पर फॉर्म पर डेटा को अपडेट करने के लिए ViewWillAppear का उपयोग करता हूं। इसलिए, ऊपर दिए गए उदाहरण के लिए, मैं इसका उपयोग वास्तव में अपने डोमेन से डेटा को फ़ॉर्म में लोड करने के लिए करूंगा। UIView का निर्माण काफी महंगा है, और आपको ViewWillAppear मेथड पर जितना संभव हो उतना करने से बचना चाहिए, जब यह कहा जाता है, तब बचे, इसका मतलब है कि iPhone पहले से ही उपयोगकर्ता को UIView दिखाने के लिए तैयार है, और कुछ भी जो आपको भारी पड़ता है। बहुत ही दृश्यमान तरीके से प्रदर्शन को प्रभावित करेगा (जैसे एनिमेशन में देरी हो रही है, आदि)।

3) ViewDidAppear : अंत में, मैं उन चीज़ों के लिए नए थ्रेड्स शुरू करने के लिए ViewDidAppear का उपयोग करता हूं, जिन्हें निष्पादित करने में लंबा समय लगेगा, जैसे कि ऊपर दिए गए फॉर्म के लिए अतिरिक्त डेटा प्राप्त करने के लिए एक webservice कॉल करना। अच्छी बात यह है कि क्योंकि दृश्य पहले से मौजूद है और उपयोगकर्ता के लिए प्रदर्शित किया जा रहा है, आप डेटा प्राप्त करते समय उपयोगकर्ता को एक अच्छा "प्रतीक्षा" संदेश दिखा सकते हैं।


4
क्षमा करें, लेकिन "मेरे डोमेन से डेटा को फ़ॉर्म में लोड करें" से आपका क्या मतलब है viewWillAppear? आप नेटवर्क के माध्यम से डाउनलोड करने का मतलब है? लेकिन आप भी इसमें सामान डाउनलोड करने का सुझाव देते हैं viewDidAppear?
फिलिप ००।

1
@ Philip007 मुझे लगता है कि स्टैक इस प्रकार के डोमेन का उल्लेख कर रहा है: en.wikipedia.org/wiki/Domain-specific_modeling । डेटा आपके मॉडल या समान से लोड किया गया है।
डेन्थरग डेस

2
यह उत्तर डॉक्स में होना चाहिए। यह वास्तव में तीन तरीकों के बीच अंतर को स्पष्ट करने में मददगार था। धन्यवाद!
GangstaGraham

1
+1, मुझे इन तीनों के बीच के अंतर को समझने में थोड़ा भ्रम हो रहा था, लेकिन आपने अभी इसे पूरी तरह से साफ कर दिया है
चेतन

@ चेतनभलारा लेकिन अगर आप लंबे समय तक काम करते हैं तो आप ViewDidAppearआसानी से यूआई के बारे में उपयोगकर्ता को भ्रमित करेंगे :)
hqt

46

viewDidLoad === >>> अपना इनिशियलाइज़ेशन कोड यहाँ डालें। डायनामिक डेटा न डालें जो दृश्य जीवनचक्र के दौरान बदल सकता है। इसलिए, यदि आप कोर डेटा से डेटा खींच रहे हैं, तो आप इसे यहां नहीं करना चाहते हैं अगर यह दृश्य के जीवन के दौरान बदल सकता है। उदाहरण के लिए: मान लें कि आपके पास एक टैब नियंत्रक है। आप टैब 1 से टैब 2 पर स्विच करते हैं और टैब 2 में मॉडल पर कुछ बदलते हैं। यदि आप टैब 1 पर वापस आते हैं और आपका मॉडल कोड viewDidLoad में किया गया था तो इसे अपडेट नहीं किया जाएगा (यह मानते हुए कि आप KVO या NSFetchedResultsController, आदि का उपयोग नहीं कर रहे हैं)।

viewWillAppear === >>> यह कहा जाता है कि हर बार दृश्य दिखाई देने वाला है, चाहे दृश्य पहले से ही स्मृति में है या नहीं। अपना डायनामिक कोड यहां रखें, जैसे कि मॉडल लॉजिक।

viewDidAppear === >>> महंगा ऑपरेशन यहां डालें जो आप तभी करना चाहते हैं जब आप सुनिश्चित करें कि व्यू ऑनस्क्रीन हो, जैसे कि नेटवर्क कॉल।

सूचना: यदि आपका ऐप बैकग्राउंड है और अग्रभूमि पर लौट आता है, तो आपको NSNotificationCenter का उपयोग करके इसे संभालना होगा। मैंने नीचे टिप्पणियों में उसके लिए कोड लिखा है। आपको लगता है कि viewWillAppear / viewDidAppear में आग लग जाएगी। वहां एक ब्रेक प्वाइंट रखें और इसका परीक्षण करें। यह आग नहीं है। इसलिए, यदि आपके ऐप के लिए कुछ बदल गया है जबकि यह पृष्ठभूमि में था तो आपको सूचनाओं का उपयोग करके अपडेट करना होगा।


1
क्या हर बार जब आप एप्लिकेशन को अन-मिनिमाइज़ करते हैं, तो ViewWill या ViewDid चलता है?
20

2
@ जीफ यह एक उत्कृष्ट प्रश्न है। जब तक एप्लिकेशन सिस्टम या उपयोगकर्ता द्वारा पृष्ठभूमि में रहते हुए नहीं मारा जाता है, तब तक न तो चलता है। अन-मिनिमाइज़्ड ऐप में नोटिफाई करने के लिए आपको क्या करना है, क्या आपको UIApplicationWillEnterForegroundNotification नाम के लिए NSNotificationCenter और addObserver का उपयोग करना होगा। चयनकर्ता को एप्लिकेशनविलेटरफॉरग्राउंड होना चाहिए: इसमें एक NSNotification पैरामाटर है। डेटा को पुनः लोड करने के लिए अपना कोड उस पद्धति में रखें, आदि जो आप कर सकते हैं वह एक पुनः लोड विधि है जिसे आप इस विधि को कहते हैं और यह भी देखने की जरूरत है कि क्या वे समान हैं।
स्माइलबोट

2
@ कुछ इस तरह से देखें: - (शून्य) viewDidLoad {[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (applicationWillEnterForeground) :) नाम: UIApplicationWillEnterForegroundNotification ऑब्जेक्ट: nil]; } - (शून्य) एप्लीकेशनविलेनटरफॉरग्राउंड: (NSNotification *) नोटिफ़ {// यहाँ जो भी हो साथ जवाब दें}
smileBot

12

viewWillAppearविधि वास्तविक दृश्य लोड करने से पहले कहा जाता है।

viewDidAppearजब दृश्य पहले से ही भरी हुई है विधि कहा जाता है, और आप कुछ दिखाना चाहते हैं।


9

viewWillAppear:
■ जिसे देखने से पहले कॉल किया जाता है, विंडोज़ के व्यू पदानुक्रम में जोड़ा
जाता है ■ जिसे [vc.view LayoutSubviews] से पहले कॉल किया जाता है (यदि आवश्यक हो)
viewDidAppear :
■ व्यू पदानुक्रम में व्यू में जोड़े जाने के
बाद कॉल किया जाता है ■ [vc.view LayoutSubviews] के बाद कॉल किया जाता है (यदि आवश्यक है)


7

कुछ अवलोकन:

  • 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। यदि संक्रमण रद्द हो जाता है, तो यह मामला नहीं होगा।


5

viewwillappear व्यू लोड करने से पहले कॉल करेगा ताकि आप लोड करने से पहले कुछ कार्य कर सकें


4

"वसीयत" और "किया" के बीच अंतर ... जैसा कि नाम से पता चलता है कि व्यूविलेपियर कहा जाता है, इससे पहले कि दृश्य दिखाई देने वाला है और व्यूडीड एपियर को तब बुलाया जाता है जब दृश्य दिखाई देता है।


स्वीकृत उत्तर भाई को देखें, जिसमें 70+ अपवोट शामिल हैं। :)
PJR

4

1) ViewWillAppear : दृश्य को वास्तव में मेमोरी में लोड किया जाता है, जिसे व्यू कंट्रोलर में एक बार कॉल किया जाता है और इसका फ्रेम होता है, लेकिन फिर भी उपयोगकर्ता को दिखाई नहीं देता है

2) ViewDidAppear : नियंत्रक को पदानुक्रम में जोड़ा गया है, इसलिए आप अगले नियंत्रक को प्रस्तुत कर सकते हैं, यह भी, दृश्य ने लेआउट को लेआउट किया



3

सारांश में:

-viewWillAppear -> अपडेट डेटा (तालिका दृश्य से डेटा पुनः लोड करें)

-viewDidAppear -> महंगे ऑपरेशन (एक अच्छी प्रगति के साथ एपीआई कॉल!)


1

जैसा कि नाम से पता चलता viewWillAppearहै कि दृश्य प्रदर्शित होने वाला है और viewDidAppearदृश्य दिखाई देने पर कहा जाता है।


0

Usecase , अर्थात मुझे कब उपयोग करना चाहिए?

viewDidLoad - जब लेबल, बटन (i, e किसी भी नियंत्रण / साक्षात्कार) दृश्य की इंटरफ़ेस फ़ाइल से जुड़े होते हैं और यदि आप एक ही समय में ViewController के दृश्य के रूप में लोड करना चाहते हैं, और यदि आप इसे एक बार मेमोरी में लोड करना चाहते हैं और इसके साथ किया

viewWillAppear- कहते हैं, आप हर बार दृश्य का बैकग्राउंड रंग बदलना चाहते हैं, स्क्रीन पर व्यूकंट्रोलर दिखाई देता है। या अधिक वास्तविक रूप से यदि आप दिन के रात के समय में DarkMode पृष्ठभूमि रंग चाहते हैं, और दिन के समय पृष्ठभूमि दृश्य का हल्का रंग, इस कोड के लिए जाएंviewWillAppear

एक और अच्छा usecase यहाँ https://stackoverflow.com/a/39395865/5438240

यह भी ध्यान दें कि, यदि आप एक नेविगेशन स्टैक ( UINavigationController) का उपयोग कर रहे हैं , तो व्यूपोन्स्टर जो पॉपअप होने वाला है, viewWillDisappear()उसे कॉल किया जाता है, और व्यूकंट्रोलर जो अगले स्टैक के शीर्ष पर होगा, viewWillAppear()उसने कॉल किया होगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.