2009-04-21 19 views
9

नहीं कहा जा रहा है मैं आईफोन प्रोग्रामिंग के लिए बहुत नया हूं और थोड़ी सी अजीबता में भाग रहा हूं। निम्न वर्ग के लिए, इनिट विधि को कभी भी कॉल नहीं किया जाता है - मेरे पास एक एनएसएलओजी फ़ंक्शन है जो मुझे बताएगा कि जब init निष्पादित किया जाता है। कुछ भी करता है, तो - मैं गलत क्या कर रहा हूँआईफोन UIViewController init विधि को

@interface MyViewController : UIViewController { 
} 
@end 

@implementation MyViewController 
- (id) init 
{ 
    NSLog(@"init invoked"); 
    return self; 
} 
@end 

के रूप में कोई भी विचार: यहाँ प्रासंगिक कोड है? उम्मीद है कि मैंने पर्याप्त जानकारी प्रदान की है।

धन्यवाद।

उत्तर

3

क्या दृश्य आ रहा है? अतिरिक्त प्रारंभिकरण के लिए इन विधियों का उपयोग करें:

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    //... 
} 

// Implement viewDidLoad to do additional setup after loading the view. 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    //.. 
} 
+0

धन्यवाद! वह काम किया। हालांकि आईफोन पर ओब्जे-सी में कुछ असंगतताओं को देखने के लिए यह मेरे मुंह में थोड़ा खट्टा स्वाद छोड़ देता है। ओह अच्छा। – farhany

22

आप शायद एनआईबी फ़ाइल से अपना व्यू कंट्रोलर बना रहे हैं। कि यदि एक बुलाया जा रहा है

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { 
     // Custom initialization 
    } 
    return self; 
} 

का प्रयास करें: तो, बजाय "init" संदेश को बुलाने की, यह एक निर्माता संदेश बुलाया जा रहा है। क्या शॉन ने कहा सच है। आप उन संदेशों को समान चीजों को पूरा करने के लिए उपयोग कर सकते हैं।

शुभकामनाएं।

+1

आप बिल्कुल सही हैं। इनपुट के लिए धन्यवाद! – farhany

+0

मैंने अपनी टिप्पणी पोस्ट करने के ठीक बाद, मुझे एहसास हुआ कि क्यों init को नहीं कहा जा रहा था ...: पी – farhany

+0

नामित प्रारंभकर्ता। यदि आप नियंत्रक ** प्रोग्रामेटिक रूप से ** बनाते हैं तो ओवरराइड करें और अनुकूलन करना चाहते हैं जो ViewDidLoad के लिए उपयुक्त नहीं है। –

1

संदर्भ दस्तावेज़ में 'नामित प्रारंभकर्ता' का भी संदर्भ लें।

2

लेकिन, एक यूआई घटक है कभी कभी severals * तरीकों init, हम कुछ init करने के लिए इन सभी तरीकों को ओवरराइड करने की आवश्यकता है। सामान?

+0

ऐसा लगता है कि आपको केवल "नामित प्रारंभकर्ता" को ओवरराइड करना होगा।यह जानने का एकमात्र तरीका यह है कि कौन सा init * विधि दस्तावेज के माध्यम से है। – Nestor

22

आप एक स्टोरीबोर्ड का उपयोग कर रहे हैं, तो initWithCoder: बुलाया जाएगा। संदर्भ दस्तावेज़ कहते हैं: अपने अनुप्रयोग के लिए एक दृश्य नियंत्रक और उसके जुड़े विचारों को परिभाषित करने के एक स्टोरीबोर्ड का उपयोग करता

हैं, तो आपके एप्लिकेशन कभी नहीं कि वर्ग सीधे की वस्तुओं initializes। इसके बजाय, दृश्य नियंत्रक या तो द्वारा instantiated कर रहे हैं स्टोरीबोर्ड या तो स्वत: आईओएस जब एक segue शुरू हो रहा है या प्रोग्राम के रूप में अपने ऐप के कॉल स्टोरीबोर्ड वस्तु की instantiateViewControllerWithIdentifier द्वारा: विधि। एक स्टोरीबोर्ड से कंट्रोलर को तुरंत चालू करते समय, आईओएस ने इसके initWithCoder को कॉल करके नया दृश्य नियंत्रक प्रारंभ किया: विधि इसके बजाय। आईओएस स्वचालित रूप से nibName प्रॉपर्टी को स्टोरीबोर्ड के अंदर संग्रहीत एक निब फ़ाइल में सेट करता है।

initWithCoder: विधि एक मीटर फ़ाइल का डिफ़ॉल्ट टेम्पलेट का हिस्सा नहीं है, तो आप अपने UIViewController उपवर्ग में अपने आप को जोड़ने के लिए:

- (id)initWithCoder:(NSCoder *)aDecoder { 

    self = [super initWithCoder:aDecoder]; 

    if (self) { 
     // Custom initialization 
     NSLog(@"Was called..."); 
    } 

    return self; 
} 

से initWithNibName:bundle: नष्ट करने के लिए कोई जरूरत नहीं है अपने कोड, लेकिन इसे वैसे भी नहीं कहा जाएगा।

+0

क्या आप इस पर विस्तार कर सकते हैं? मैं subclass MyController के दृश्य नियंत्रक का उपयोग कर रहा हूं जिसे मैंने स्टोरीबोर्ड में बनाए गए व्यू कंट्रोलर को सेट किया है। हालांकि, मेरी .m फ़ाइल में, मुझे केवल initWithNibName विधि दिखाई देती है और कोई initWithCoder विधि नहीं है। क्या मुझे initWithNibName को हटाना है और initWithCoder में डालना है या क्या मैं कुछ और गलत कर रहा हूं? – snapfish

+0

initWithNibName को हटाने की कोई आवश्यकता नहीं है। बस initWithCoder जोड़ें (यह विधि एक .m फ़ाइल के लिए डिफ़ॉल्ट टेम्पलेट में नहीं है)। मैंने इसका जवाब बदलने के लिए अपना जवाब बदल दिया है। – reinaldoluckman

+1

मेरे संपादन को स्वीकार करने के लिए धन्यवाद, कोई विचार नहीं कि इसे क्यों अस्वीकार कर दिया गया था या वे क्या सोचते हैं कि [सुपर इनिट] Grrr के बिना स्वयं होने वाला है। चीयर्स :) –

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