UIViewController viewDidLoad बनाम viewWillAppear: श्रम का उचित विभाजन क्या है?


164

मैं हमेशा उन कार्यों के प्रकार पर थोड़ा अस्पष्ट रहा हूं जिन्हें एक उपवर्ग में viewDidLoadबनाम viewWillAppear: को सौंपा जाना चाहिए UIViewController

उदाहरण के लिए, मैं एक ऐप कर रहा हूं जहां मेरे पास एक UIViewControllerसबक्लास है जो एक सर्वर को मार रहा है , डेटा प्राप्त कर रहा है, इसे एक दृश्य को खिला रहा है और फिर उस दृश्य को प्रदर्शित कर रहा है। viewDidLoadबनाम में ऐसा करने के पेशेवरों और विपक्ष क्या हैं viewWillAppear?

जवाबों:


251

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

हालांकि, जब आप सर्वर से चीजों को लोड कर रहे होते हैं, तो आपको विलंबता के बारे में भी सोचना होगा। यदि आप अपने सभी नेटवर्क संचार को viewDidLoad या viewWillAppear में पैक करते हैं, तो उपयोगकर्ता द्वारा दृश्य को देखने से पहले उन्हें निष्पादित किया जाएगा - जिसके परिणामस्वरूप आपके ऐप का एक छोटा फ्रीज हो सकता है। पहले उपयोगकर्ता को किसी प्रकार के गतिविधि संकेतक के साथ एक अनपेक्षित दृश्य दिखाना अच्छा होगा। जब आप अपने नेटवर्किंग के साथ किया जाता है, जो एक दूसरे या दो (या भी विफल हो सकता है - कौन जानता है?), आप अपने डेटा के साथ दृश्य को आबाद कर सकते हैं। यह कैसे किया जा सकता है पर अच्छे उदाहरण विभिन्न ट्विटर क्लाइंट में देखे जा सकते हैं। उदाहरण के लिए, जब आप Twitter में लेखक का विवरण पृष्ठ देखते हैं, तो दृश्य केवल "लोड हो रहा है ..." जब तक नेटवर्क क्वेरी पूरी नहीं हो जाती।


इसलिए, viewWillAppear के बारे में संभावित रूप से बार-बार कॉल किया जा रहा है। क्या वह विधि अग्नि होगी, उदाहरण के लिए, व्यू-कॉन्ट्रॉलर्स दृश्य छिप जाने के बाद दृश्यमान हो गए (मेरा मतलब है कि यहां उकेरा गया है, UIView पर छिपा हुआ तरीका नहीं है)। देखने के लिए कॉल करने से पहले बिना वॉनवेरियन को कैसे देखा जाएगा।
दुगला

7
जब व्यू का निर्माण किया जाता है, तो viewDidLoad को केवल कॉल किया जाता है - उदाहरण के लिए व्यू कंट्रोलर initFromNibNamed कॉल के बाद। viewWillAppear को कभी भी तब देखा जाता है जब आपका व्यू कंट्रोलर देखने में नहीं था, लेकिन देखने में आता है - इसलिए जब आपके व्यू कंट्रोलर को धक्का दिया जाता है, तो viewillillear को कहा जाता है। यदि आप वहां से एक और सबव्यू धक्का देते हैं, और उपयोगकर्ता वापस लौटता है, तो viewWillAppear फिर से कहा जाता है।
केंडल हेल्मसटेटर जेलर

धन्यवाद केंडल याह, कुछ रणनीतिक रूप से रखे गए NSLogs मुझे मिल गए। viewWillAppear / viewWillDissappear viewcontroller पुश / पॉप पर आग।
दुगला १६'०

3
ध्यान दें कि viewDLoLoad को ALSO कहा जाएगा यदि दृश्य छिपा हुआ है और फिर मेमोरी से संबंधित कारणों के लिए अनलोड किया जाता है, तो फिर दिखाई देता है। जब आप देख सकते हैं: viewDidLoad को AT LEAST ONCE कहा जाएगा जब दृश्य पहली बार बनाया गया हो और POSSIBLY अधिक बार जब दृश्य छिपाए जाने के बाद फिर से दिखाई दे। जब व्यू ऑनस्क्रीन दिखाई देगा, तब viewWillAppear को हमेशा बुलाया जाएगा।
डैनएम

2
क्या कोई कृपया इन दो संबंधित प्रश्नों पर आगे टिप्पणी कर सकता है: (1) कभी-कभी, हमेशा नहीं, नियंत्रण के लिए फ्रेम मान (अर्थात, उत्पत्ति और आकार) दृश्य में शून्य हैं, और कभी-कभी - क्यों नहीं? (2) एक स्प्लिट व्यू कॉन्ट्रोलर के डिटेल व्यू (आईपैड) के लिए ऐप्पल के टेम्पलेट में, एक कॉन्फ़िगर व्यू पद्धति है - व्यूडिलडैड और व्यूविलेपियर के सापेक्ष वहाँ क्या जाना चाहिए?
जेफ़

12

प्रारंभ में केवल TableView के साथ ViewDidLoad का उपयोग किया गया था। वाईफ़ाई की हानि के साथ परीक्षण करने पर, डिवाइस को हवाई जहाज मोड में सेट करके, एहसास हुआ कि टेबल वाईफ़ाई की वापसी के साथ ताज़ा नहीं हुई थी। वास्तव में, YES -Info.plist में सेट पृष्ठभूमि मोड के साथ होम बटन को हिट करके भी डिवाइस पर तालिका दृश्य को रीफ्रेश करने का कोई तरीका नहीं प्रतीत होता है।

मेरा समाधान:

-(void) viewWillAppear: (BOOL) animated { [self.tableView reloadData];}

10

यह ध्यान रखना महत्वपूर्ण है कि पोजिशनिंग के लिए व्यूडेलडैड का उपयोग करना थोड़ा जोखिम भरा है और इससे बचना चाहिए क्योंकि सीमा निर्धारित नहीं है। इससे अप्रत्याशित परिणाम हो सकते हैं (मेरे पास कई प्रकार के मुद्दे थे ...)

यह पोस्ट बहुत अच्छी तरह से विभिन्न तरीकों का वर्णन करता है और उनमें से प्रत्येक में क्या होता है।

वर्तमान में एक बार की init और पोजिशनिंग के लिए मैं एक फ्लैग के साथ viewDidAppear का उपयोग करने के बारे में सोच रहा हूं, अगर किसी के पास कोई अन्य सिफारिश है तो कृपया मुझे बताएं।


इस बात से सहमत हैं: "... सीमा
समाप्त

4

निर्भर करता है, क्या आपको हर बार दृश्य को खोलने के लिए डेटा लोड करने की आवश्यकता है ? या केवल एक बार ?

यहां छवि विवरण दर्ज करें

  • लाल: उन्हें हर बार बदलने की आवश्यकता नहीं है। एक बार जब वे लोड हो जाते हैं तो वे वैसे ही रहते हैं जैसे वे थे।
  • बैंगनी: आपको हर बार लोड करने के बाद या समय के साथ बदलना होगा। आप उन्हीं 3 सुझाए गए उपयोगकर्ताओं को देखना नहीं चाहते हैं, जिन्हें आपको स्क्रीन पर वापस आने के बाद पुनः लोड करना होगा। उनकी तस्वीरें अपडेट हो सकती हैं ... आप 5 साल पहले की फोटो नहीं देखना चाहते ...

viewDidLoad: आपके पास जो भी प्रसंस्करण है उसे एक बार करने की आवश्यकता है।
viewWilLAppear:पेज लोड होने पर हर बार जो भी प्रोसेसिंग को बदलना होगा।

लेबल, आइकन, बटन शीर्षक या अधिकांश डेटाइन्पुटेड बायड्यूप्लर आमतौर पर बदलते नहीं हैं। नाम, फ़ोटो, लिंक, बटन की स्थिति, सूचियाँ (आपके टेबल व्यू या संग्रह दृश्य के लिए इनपुट एरे) या अधिकांश डेटाइन्पुटेड बायर्स आमतौर पर बदलते हैं।


बैंगनी को व्यूडीडियर कहा जाता है, न कि व्यूप्लेयर
एलेक्स कॉर्नहॉज़र

@AlexKornhauser का क्या मतलब है कि इसे कहा जाएगा? मैं कह रहा हूं कि आप अपने viewWillAppearट्वीट को लेट कर ट्वीट कर सकते हैं। viewDidAppearउसके लिए बहुत देर हो चुकी है
हनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.