2011-06-13 23 views
6

में कुछ बार प्रारंभ करने के लिए कहां है मेरे पास एक UIViewController सबक्लास है और मैं यह पता लगाने की कोशिश कर रहा हूं कि इस पर ओवरराइड करना है कि मैं प्रति ऑब्जेक्ट आवृत्ति केवल एक बार प्रारंभिक कोड चला सकता हूं।UIViewController

viewDidLoad विधि स्पष्ट उत्तर की तरह लग सकती है, लेकिन समस्या यह है कि viewDidLoad एक से अधिक बार चला सकता है यदि नियंत्रक स्मृति चेतावनी के कारण दृश्य को रीसेट करता है। initWithNibName:bundle:, init, और initWithCoder: विधियां भी अच्छे विकल्प की तरह लगती हैं, लेकिन कौन सा ओवरराइड करना है? awakeFromNib विधि एक और विचार है, लेकिन ऐसा लगता है कि मेरे व्यू कंट्रोलर में निष्पादित नहीं किया गया है।

क्या ऐसा करने का कोई तरीका है कि मुझे याद आ रही है?

उत्तर

4

आप शायद अभी भी viewDidLoad का उपयोग कर सकते हैं, लेकिन यह देखने के लिए कि आप पहले से वहां हैं या नहीं, एक स्थिर बूलियन का उपयोग करें।

static BOOL didInitialize = NO; 
if (didInitialize == YES) 
    return; 

didInitialize = YES; 
/* initialize my stuff */ 
+0

मुझे लगता है कि मेरा प्रश्न स्पष्ट नहीं था। मेरा मतलब है कि मेरे ऑब्जेक्ट उदाहरण हैं, लेकिन मुझे लगता है कि एक ही दृष्टिकोण को ऑब्जेक्ट वैरिएबल के साथ इस्तेमाल किया जा सकता है। – chris

2

+(void)initialize के बारे में क्या? यह क्लास प्रारंभकर्ता है कि आईओएस कक्षा के लिए, एक बार आपके लिए कॉल करता है, जैसा कि मैं इसे समझता हूं।

+0

'if (self == [MyViewController class])' की जांच करना याद रखें। –

+0

क्या + (शून्य) प्रारंभ होता है जब वस्तु को निब से अनपॅक किया जाता है? यदि नहीं, तो आवश्यक प्रारंभिकता सही ढंग से नहीं हो सकती है। –

+0

यदि यह एक निब से लोड हो रहा है, तो आप पुनर्निर्मित ऑब्जेक्ट के लिए एक बार सेटअप करने के लिए '- (शून्य) जागृत FromNib' लागू कर सकते हैं। लेकिन यह वर्ग प्रारंभिक नहीं है; यह एक निब ऑब्जेक्ट एक बार सेटअप के प्रति-उदाहरण है। विभिन्न। –

5

UIViewControllers के नामित प्रारंभकर्ता, विधि है जो अन्य सभी initializers फोन करने वाले हैं, -initWithNibName:bundle: है। यदि आप अपना व्यू कंट्रोलर बनाते समय कुछ प्रारंभ करना चाहते हैं, तो उस विधि को ओवरराइड करें।

-viewDidLoad किसी भी सेटअप के लिए है जो नियंत्रक के विचारों पर निर्भर करता है। जैसा कि आप इंगित करते हैं, वह विधि एक से अधिक बार चल सकती है क्योंकि विचार एक से अधिक बार लोड किए जा सकते हैं। -awakeFromNib तब तक आपकी सहायता नहीं करेगा जब तक कि आपका व्यू कंट्रोलर स्वयं निब में मौजूद न हो, और फिर भी यह केवल तभी समझ में आता है जब आप जिस चीज को प्रारंभ कर रहे हैं वह उसी ऑब्जेक्ट पर अन्य ऑब्जेक्ट्स पर निर्भर करता है।

+0

अगर मुझे गलत नहीं लगता है, '-initWithFrame:' UIViewController की विधि नहीं है, इसलिए मुझे नहीं लगता कि यह काम करेगा। शायद आप का अर्थ है 'initWithNibName: बंडल: '? – chris

+0

दोह। आप सही हैं, ज़ाहिर है ... मैं UIView के बारे में सोच रहा था, UIViewController नहीं। मैं पोस्ट ठीक कर दूंगा। – Caleb

+0

यह उत्तर सही है। केवल एक init विधि को अपना प्रारंभिक कोड चलाया जाना चाहिए, और अन्य init विधियों को उस init विधि को कॉल करना चाहिए। –

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