2009-05-25 12 views
6

मेरे पास एक ऐसा एप्लिकेशन है जो पूरी तरह से आईफोन 2.2.1 पर काम करता है लेकिन जब मैं इसे आईफोन 3.0 पर चलाने की कोशिश करता हूं तो यह क्रश हो जाता है।"टैब बार के प्रतिनिधि को बदलना" अपवाद

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Changing the delegate of a tab bar managed by a tab bar controller is not allowed.' 

शायद यह इसलिए होता है क्योंकि मैं प्रोग्राम के रूप में एक निश्चित दृश्य नियंत्रक को देखते बदल रहा हूँ:

यहाँ त्रुटि मैं कंसोल से मिल गया है।

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

    self.view = current_controller.view; 
    [current_controller viewWillAppear: NO]; 
    [current_controller viewDidAppear: NO]; 
} 

एक त्रुटि कोड के इस हिस्से में हो सकता है और अगर हां मैं इसे कैसे ठीक कर सकते हैं:

यहाँ कोड है? और क्यों हो सकता है?

अग्रिम धन्यवाद, इल्या।

उत्तर

4

उपरोक्त श्री अर्न्स्ट इंप्रेशन देता है कि वह इलिया के कोड में कुछ देखता है जो "नियंत्रक के नीचे से बाहर निकलने वाला दृष्टिकोण" बनाता है। यह आपको लंबे समय तक कोड पर देख सकता है और यह वह जगह नहीं है जहां समस्या वास्तव में है। मैंने इस समस्या को ऐप्पल डेवलपर फोरम http://discussions.apple.com/message.jspa?messageID=10259835#10259835 पर पोस्ट किया था और मुझे बताया गया था कि 'एनएसआईएननल इन्कॉन्सिस्टेंसी एक्सेप्शन' एक .xib फ़ाइल (इंटरफ़ेस बिल्डर में) के साथ एक समस्या है। इस जानकारी का उपयोग करके मुझे निम्नलिखित समाधान मिला। मुझे लगता है कि यहां दिए गए कुछ नाम सामान्य हैं और इस समस्या को ठीक करने की कोशिश करने वाले अन्य लोगों को सहायता देंगे। समस्या की समीक्षा करने के लिए, xib संदर्भ 2.x पर पूरी तरह से संकलित और चलाता है, 3.x पर संकलित करता है और जब आप 3.0 सिम्युलेटर में एप्लिकेशन को चलाने का प्रयास करते हैं तो ऊपर त्रुटि संदेश देता है। मेरे पास टैब बार में एक प्रतिनिधि था। इंटरफ़ेस बिल्डर में रेफरेंसिंग आउटलेट देखने में मैंने संदर्भित आउटलेट के रूप में "एकाधिक", "फ़ाइल का स्वामी", "टैब बार" और "टैब बार नियंत्रक" था। जब मैंने रेफरेंसिंग आउटलेट से "टैब बार" हटा दिया तो मेरा ऐप सिम्युलेटर 3.0 में चला गया। यह संकलित और 2.x पर चला गया, इसलिए "टैब बार" संदर्भ 2.x द्वारा आवश्यक नहीं था। ... फ्लैश गॉर्डन

+0

है कि मैं वास्तव में क्या किया है! :) –

0

काफी सरलता से, आप ऐसा नहीं कर सकते हैं। UIViewController के नीचे से दृश्य को यंक करना एक दुर्घटना पाने का एक निश्चित तरीका है।

टैब बार ट्यूटोरियल देखें, ऐप्पल यह देखने के लिए प्रदान करता है कि यह ठीक से कैसे किया जाता है।

0

यह एक गैर तुच्छ समस्या है। किसी ने ViewController के अंतर्गत से एक दृश्य को हटाने का एक उदाहरण पोस्ट किया होगा क्योंकि बहुत से लोगों ने इसे किया था। और यह कैसे "बुरा" था, इस बारे में सभी बातों के बावजूद, यह 2.x में काम किया। यहां तक ​​कि सेब आलेख आर्किटेक्चर मुद्दे से निपटता नहीं है। अधिकांश लोग प्रत्येक उप-नियंत्रक दृश्य को संभालने के लिए .h/.m संयोजन लिखने जा रहे हैं। सेब उदाहरण केवल .m फ़ाइल में काम करता है जो टैबबार नियंत्रक को नियंत्रित करता है।

0

मैं मेरे लिए निम्नलिखित समाधान नहीं मिला:

  1. उपवर्ग UITabBarController
  2. इंटरफ़ेस बिल्डर में अपने नए वर्ग के लिए "कस्टम वर्ग> कक्षा" अपने UITabBar के गुण सेट
  3. अपनी कक्षा में निम्न कोड जोड़ें

    -(void)tabBar:(UITabBar *)tabBar willBeginCustomizingItems:(NSArray *)items{ 
        id modalViewCtrl = [[[self view] subviews] objectAtIndex:1]; 
        if([modalViewCtrl isKindOfClass:NSClassFromString(@"UITabBarCustomizeView")] == YES) 
         ((UINavigationBar*)[[modalViewCtrl subviews] objectAtIndex:0]).tintColor = [UIColor blackColor]; 
    } 
    

उम्मीद है कि यह मदद करता है ...

7

ज्यादातर मामलों में आप इसके बजाय UITabBarControllerDelegate का उपयोग कर सकते हैं। इसके पास UITabBarDelegate के समान तरीके हैं और इस तरह के अपवाद से बचाते हैं। के लिए, उदाहरण के लिए, के बजाय:


- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item { 

    int index = [tabBar determinePositionInTabBar:item]; // custom method 
    [tabBar doSomethingWithTabBar]; 
    [item doSomethingWithItem]; 
    [item doSomethingWithItemAndIndex:index]; 
} 

आप लिख सकते हैं:


- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { 

    UITabBarItem *item = [tabBarController.tabBar selectedItem]; 
    int index = [tabBarController.tabBar determinePositionInTabBar:item]; // custom method 
    [tabBarController.tabBar doSomethingWithTabBar]; 
    [item doSomethingWithItem]; 
    [item doSomethingWithItemAndIndex:index]; 
} 
+1

अच्छा विकल्प (वाई) –

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