2013-02-18 12 views
12

मैं एक विवरण दृश्य नियंत्रक में निम्न कोड मिल गया है चलाता है [self configureView] दो बार कहा जाता है। हालांकि:विधि -viewWillLayoutSubviews में कहा जाता बेवजह दो बार

  • दोनों बार विधि मारा जाता है, ढेर इस तरह दिखता है:

stack

  • जब मैं उपरोक्त कोड में [self configureView] टिप्पणी, यह शून्य बार मारा है।
  • स्टैक द्वारा स्पष्ट रूप से दोनों बार स्पष्ट होने के कारण, -configureView खुद को रिकर्सिव रूप से कॉल नहीं करता है।
  • -configureView केवल उपरोक्त कोड में बुलाया जाता है।
+0

तो 'viewWillLayoutSubviews' को दो बार बुलाया जाता है? फिर सवाल यह है कि आपके व्यू कंट्रोलर में फिर से लेआउट ट्रिगर कर रहा है? – abellina

+0

हाँ, अच्छा बिंदु। सवाल यह है कि,'viewWillLayoutSubviews' को दो बार क्यों कहा जा रहा है। ढेर पर एक ही तरह से। –

उत्तर

1

यदि आप सामान्य पैटर्न का पालन करते हैं तो कॉन्फ़िगरेशन को detailItem के सेटटर में कॉन्फ़िगर किया जाता है। सेटर विधि की जांच करें। और [detailViewController setDetailItem:something] को अक्सर prepareForSegue: में बुलाया जाता है।

मुख्य बिंदु यह है: क्या इससे कोई फर्क पड़ता है?

+1

मैं इसे '-viewWillLayoutSubviews' में कॉल करता हूं क्योंकि मैं मानों को किसी भी समय मॉडल से अद्यतन करने के लिए मानना ​​चाहता हूं। इसे सेटटर में कॉल करने से अधिक संरचनात्मक भावना होती है, लेकिन दृश्यों की ओर जाता है जो एक सेग्यू से पहले अपडेट नहीं किया जाता है, जिससे स्टेल डेटा की प्रस्तुति होती है। वैसे भी हाँ, यह निश्चित रूप से मायने रखता है! एक बात के लिए, मैं व्यवहार को समझना चाहता हूं। इसके अलावा, अगर मैं इस विधि में एक गहन ऑपरेशन चाहता था तो क्या होगा? इसे दो बार निष्पादित क्यों करना चाहिए? –

+1

मैंने यह नहीं कहा कि आपको इसे सेटर से कॉल करना होगा। मैं बस संकेत देना चाहता हूं कि आप इसे वास्तव में सेटर से भी बुला सकते हैं जिससे इसे दो बार बुलाया जा सकता है। बस इतना ही। हालांकि, मुझे विश्वास नहीं है कि मॉडल से डेटा रीफ्रेश करने के लिए यह एक उचित जगह है। ViewWillAppear उस उद्देश्य के लिए पर्याप्त होना चाहिए। –

+0

धन्यवाद हरमन! मैं यहां एक लुक रिपोर्ट लेगा। मैं उद्धरण के बारे में सोच रहा हूं, "प्रोग्रामर अपने कार्यक्रमों के गैर-कृत्रिम हिस्सों की गति के बारे में सोचने, या चिंता करने के बारे में बहुत अधिक समय बर्बाद करते हैं ..." Knuth (http://c2.com/cgi/wiki?PrematureOptimization) द्वारा ।मैं बस यह सुनिश्चित करने की कोशिश कर रहा हूं कि मैं समझता हूं कि ये सभी विधियां रनटाइम में कैसे हैं। 'ViewWillAppear' को इंगित करने के लिए धन्यवाद –

11
Apple's documentation से

: करने के बाद दृश्य आकार दिया और उसकी मूल द्वारा स्थिति में है

viewWillLayoutSubviews विधि भी कहा जाता है।

viewWillLayoutSubviews को देखते हुए कहा जाता नियंत्रक के दृश्य पर bounds परिवर्तन, वहाँ कोई गारंटी नहीं है कि यह एक बार ही लागू किया जा जाएगा जब भी कर रहा है। जब भी रोटेशन उदाहरण के लिए होता है तो इसे कॉल किया जाएगा।

आपका configureView विधि शायद बेहतर प्रति Hermann's suggestion रूप BirdDetail आइटम के लिए भी एक कस्टम mutator कहीं और से कहा जाता है, viewWillAppear में शायद, viewDidAppear या।

संबंधित मुद्दे