2009-10-16 16 views
146

मैं हमेशा viewDidLoad बनाम viewWillAppear को UIViewController सबक्लास में असाइन किए जाने वाले कार्यों के प्रकार पर थोड़ा अस्पष्ट रहा हूं।UIViewController viewDidLoad बनाम देखें WillAppear: श्रम का उचित विभाजन क्या है?

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

उत्तर

236

viewDidLoad एक चीज है जो आपको एक बार करना है। व्यू विल्लएपियर हर बार दृश्य प्रकट होने पर बुलाया जाता है। आपको उन चीजों को करना चाहिए जो आपको देखने के लिए केवल एक बार करना है - डीडलोड - जैसे आपके यूलाबेल ग्रंथों को सेट करना। हालांकि, जब भी उपयोगकर्ता इसे देखने के लिए हर बार दृश्य के एक विशिष्ट भाग को संशोधित करना चाह सकता है, उदा। जब भी आप "नाऊ बजाना" दृश्य पर जाते हैं, तो आइपॉड एप्लिकेशन गीतों को शीर्ष पर वापस स्क्रॉल करता है।

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

+0

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

+5

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

+0

धन्यवाद केंडल। हां, कुछ रणनीतिक रूप से स्थापित एनएसएलओजी ने मुझे हल किया। viewWillAppear/viewWillDissDrollroller पुश/पॉप पर आग लगाना। – dugla

11

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

मेरे समाधान:

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

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

This post अलग-अलग तरीकों का वर्णन करता है और उनमें से प्रत्येक में क्या होता है।

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

+0

इसके साथ सहमत हैं: "... सीमाओं को सेट नहीं होने के बाद से बचा जाना चाहिए ..." – danisupr4

3

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

enter image description here

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

viewDidLoad: जो भी संसाधन आप एक बार किया जाना चाहिए कि है।
viewWilLAppear: जो भी प्रसंस्करण पृष्ठ लोड होने पर हर बार बदलने की जरूरत है।

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