6

Using initWithNibName changes absolutely nothing पोस्ट में, वह एक ही दृश्य निब परिभाषा के दो उपयोग दिखाता है, पहले मामले में, वह बस एलोक/इनिट और दूसरा कॉल करता है, वह initWithNibName निर्दिष्ट करता है।मुझे कॉल करने की आवश्यकता कब है - [UIViewController initWithNibName: बंडल:]?

तो, जबकि यह हमेशा काम करता है:

MyViewController *vctrlr = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; [self.navigationController pushViewController:vctrlr animated:YES]; [vctrlr release];

सभी देखें नियंत्रकों मैं विरासत में मिला है उसके लिए निम्नलिखित काम करता है, लेकिन मेरा नहीं!

TheirViewController *vctrlr = [[TheirViewController alloc] init]; [self.navigationController pushViewController:vctrlr animated:YES]; [vctrlr release];

नए आईओएस प्रोग्रामिंग करने के लिए, मैं कुछ कोड विरासत में मिला। आईबी में सभी व्यू कंट्रोलर के विचार परिभाषित किए गए हैं, लेकिन उन दृश्य नियंत्रकों के असंगत आवंटन/इनिट निर्माण थे। मैंने एक नया व्यू कंट्रोलर और एक्सआईबी बनाया है, लेकिन यह तब तक काम नहीं करता जब तक कि मैं initWithNibName का उपयोग नहीं करता (जब मैं व्यू कंट्रोलर को एनवी कंट्रोलर पर दबाता हूं तो क्रैश हो जाता है)। मैं नहीं बता सकता कि मेरा व्यू कंट्रोलर दूसरों की तुलना में अलग कैसे है ... कोई संकेत? मैं ऐप में अन्य सभी व्यू कंट्रोलर के लिए initNibName उपयोग को हटाने में सक्षम था।

+0

आम तौर पर यह के रूप में यह वास्तव में ViewController से देखने बाहर सार निब नाम निर्दिष्ट करने के लिए अच्छा है। उदाहरण के लिए, यदि आपके पास एक नियंत्रक है जिसमें कुछ स्थितियों के आधार पर थोड़ा अलग विचार हैं, तो आप अपने विचारों के रूप में अलग-अलग निब्स में लोड कर सकते हैं। – Rexeisen

+0

क्या आपने 'vctrlr' में 'loadView' विधि लागू की है? –

+0

'लोड व्यू' को किसी भी मामले में लागू नहीं किया गया है। – wrlee

उत्तर

1

आप किसी भी स्ट्रिंग नाम को initWithNibName: पर पास कर सकते हैं। जब आप अपनी कक्षा MyClassName कहलाती हैं तो आप initWithNibName:@"MyClassName" पर कॉल करने के लिए प्रतिबंधित नहीं हैं। यह initWithNibName:@"MyClassNameAlternateLayout" हो सकता है।

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

एक अन्य महत्वपूर्ण बात यह है कि initWithNibName:bundle:UIViewController के लिए नामित प्रारंभकर्ता है। जब आप -[[UIViewController alloc] init] पर कॉल करते हैं, तो initWithNibName:bundle: दृश्यों के पीछे बुलाया जाता है। आप इसे प्रतीकात्मक ब्रेकपॉइंट के साथ सत्यापित कर सकते हैं। दूसरे शब्दों में, यदि आप केवल डिफ़ॉल्ट व्यवहार चाहते हैं, तो यह उम्मीद की जाती है कि आप -[[UIViewController alloc] init] पर कॉल कर सकते हैं और नामित प्रारंभकर्ता को निस्संदेह कहा जाएगा।

यदि, हालांकि, आप -[[UIViewController alloc] init] पर कॉल कर रहे हैं और अपेक्षित व्यवहार नहीं प्राप्त कर रहे हैं, तो संभवतः आपके UIViewController subclass ने - (id)init गलत तरीके से कार्यान्वित किया है। कार्यान्वयन इन दो उदाहरणों में से एक तरह दिखना चाहिए:

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     // custom initialization 
    } 
    return self; 
} 

या

- (id)init 
{ 
    NSString *aNibName = @"WhateverYouWant"; 
    NSBundle *aBundle = [NSBundle mainBundle]; // or whatever bundle you want 
    self = [self initWithNibName:aNibName bundle:aBundle]; 
    if (self) { 
     // custom initialization 
    } 
    return self; 
} 
+1

+1: मैं यह भी जोड़ना चाहता हूं कि आप * अलग-अलग 'UIViewController' के लिए एक ही xib * का उपयोग कर सकते हैं। उदाहरण के लिए, आपके पास एक अभिभावक 'UIViewController' हो सकता है जिसमें उप-वर्ग होते हैं जिनके समान सेट' आईबीओलेटलेट 'का उपयोग करते हुए समान (लेकिन समान नहीं) कार्यक्षमता होती है। इस मामले में, आपको 'initWithNibName: बंडल:' विधि का उपयोग करने के लिए मूल 'xib' फ़ाइल का नाम निर्दिष्ट करने की आवश्यकता होगी। –

0
If you want to work following code: 

MyViewController *vctrlr = [[MyViewController alloc] inil]; 
[self.navigationController pushViewController:vctrlr animated:YES]; 

Then you should implement following both methods in MyViewController: 

- (id)init 
{ 
    self = [super initWithNibName:@"MyViewController" bundle:nil]; 
    if (self != nil) 
    { 
     // Do initialization if needed 
    } 
    return self; 
} 
- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle 
{ 
    NSAssert(NO, @"Init with nib"); 
    return nil; 
} 
+0

आपने विधि का उपयोग गलत है क्योंकि बाहर से व्यू कंट्रोलर की ऑब्जेक्ट बनाते समय nib फ़ाइल नाम का उपयोग करके, Encapsulation को तोड़ता है। –

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