2008-12-04 12 views
14

जब UIViewController की दृश्य संपत्ति का उपयोग किया जाता है, तो यह पहले यह देखने के लिए जांच करता है कि यह एक मौजूदा दृश्य है या नहीं, और उसे वापस कर देता है। यदि नहीं, तो यह इसके निब या कॉल -लोड व्यू लोड करता है।यह निर्धारित करने का सबसे अच्छा तरीका है कि UIViewController लोड हो चुका है, और उसका वैध दृश्य है?

जब एक नियंत्रक को -didReceiveMemory चेतावनी संदेश प्राप्त होता है, तो डिफ़ॉल्ट व्यवहार उस कैश किए गए दृश्य को निकालना है (माना जाता है कि यह उस समय उपयोग में नहीं है)।

यदि मैं ओवरराइड करता हूं-didReceiveMemoryWarning, मैं कैसे निर्धारित कर सकता हूं कि दृश्य साफ़ कर दिया गया है या नहीं? मेरी समझ यह है कि डिफ़ॉल्ट कार्यान्वयन जांचता है कि क्या self.view.superview == nil। यदि ऐसा है, तो यह कैश किए गए दृश्य को साफ़ करता है। बेशक, यह पहली बार यह देखने के लिए जांच करता है कि एक कैश किए गए दृश्य है, और यदि नहीं, तो यह कुछ भी नहीं करता है। हालांकि, मैं, सबक्लास के रूप में, self.view.superview को कॉल नहीं कर सकता, क्योंकि एक दृश्य नहीं है, यह एक उत्पन्न करेगा।

तो, अगर मैं मौजूद हूं तो मैं कैसे पता लगा सकता हूं? (मैं सिर्फ _view पर नहीं देख सकता; डिवाइस के निर्माण के दौरान मुझे त्रुटियों को जोड़ना पड़ता है)।

उत्तर

3

मुझे लगता है कि अपनी स्थिति में ऐसा लगता है कि कुछ करने के लिए सबसे अच्छा है:

- (void)setView:(UIView *)view 
{ 
    if (!view) 
    { 
     // Clean up code here 
    } 

    [super setView:view]; 
} 
+0

यह कुछ हद तक नाजुक लगता है (यह हमेशा अपने स्वयं के एक्सेसर्स का उपयोग करके ऐप्पल पर निर्भर करता है), लेकिन ऐसा लगता है। धन्यवाद! –

+1

मैं मानता हूं कि यह थोड़ा नाजुक है, लेकिन कुछ और दस्तावेज नहीं है, और निश्चित रूप से ivars तक पहुंचने से कम कमजोर है –

+3

['- [UIViewController isViewLoaded]'] (http://stackoverflow.com/a/1076425/242933)। – ma11hew28

0

आप एक्सेसर के माध्यम से बिना मूल्य के प्राप्त करने के लिए object_getIvar() का उपयोग कर सकते हैं। संक्षेप में, यह आपको इसके खिलाफ लिंक करने की आवश्यकता के बिना _view पर पहुंचने देता है। दूसरी ओर, यदि वास्तविक ivar चला जाता है या उसका नाम बदला जाता है तो इसमें तोड़ने की क्षमता होती है। परंपरागत रूप से यह कभी भी एक वास्तविक चिंता नहीं थी, लेकिन आईफोन आधुनिक रनटाइम का उपयोग करता है जो नाजुक बेस क्लास के मुद्दों से ग्रस्त नहीं है, इसलिए ऐप्पल उन प्रकार के बदलावों को और अधिक इच्छुक महसूस कर सकता है।

66

iPhone OS 3.0 के बाद से, आप अगर एक दृश्य लोड किया जाता है देखने के लिए isViewLoaded विधि का उपयोग कर सकते हैं।

+1

यह अब सही जवाब होना चाहिए! – huesforalice

+0

लिंक टूटा हुआ है। – Chris

+0

बस लिंक को ठीक किया गया – Zargony

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

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