2012-05-01 16 views
5

में अधिक नेविगेशन नियंत्रक को दबाएं मैंने एक परियोजना के लिए एक कस्टम UITabBar समाधान लागू किया है। अनिवार्य रूप से, यदि 5 से अधिक आइटम हैं, तो मैं स्क्रॉल व्यू का उपयोग करता हूं जो उपयोगकर्ता को अतिरिक्त टैब आइटम्स के माध्यम से स्क्रॉल करने और अधिक बटन दबाएगा। मौसम चैनल ऐप में एक समान रूप और अनुभव देखा जा सकता है।कस्टम UITabBarController

प्रत्येक टैब बार आइटम एक UINavigationController से मेल खाता है जो प्रत्येक टैब के लिए दृश्यों के ढेर का प्रबंधन करता है। मेरे पास जो समस्या है, वह तब है जब मेरे पास 5 से अधिक टैब आइटम हैं, टैब 5 से आगे नेविगेशन स्टैक को सही ढंग से बनाए नहीं रखता है। ऐसा लगता है कि जब भी आप उस टैब पर वापस आते हैं तो अधिक नेविगेशन नियंत्रक नेविगेशन स्टैक को मारता है और आपको फिर से प्रारंभिक पृष्ठ पर लाया जाता है।

मैं setSelectedViewController विधि अधिरोहित किया है इस प्रकार है:

- (void) setSelectedViewController:(UIViewController *)selectedViewController { 
    [super setSelectedViewController:selectedViewController]; 
    if ([self.moreNavigationController.viewControllers count] > 1) { 
     self.moreNavigationController.viewControllers = [[NSArray alloc] initWithObjects:self.moreNavigationController.visibleViewController, nil]; 
    } 
} 

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

उत्तर

5

यह कैसे मैं इस फिक्सिंग समाप्त हो गया है:

- (void) setSelectedViewController:(UIViewController *) selectedViewController { 
    self.viewControllers = [NSArray arrayWithObject:selectedViewController]; 
    [super setSelectedViewController:selectedViewController]; 
} 

मूल रूप से 5 पर moreNavigationController द्वारा प्रतिस्थापित अपने नेविगेशन नियंत्रक हो जाता है जब आप intiially UITabBarController पर viewControllers सेट से किसी भी टैब। इसलिए, मैं गतिशील रूप से उस टैब को शामिल करने के लिए दृश्य नियंत्रक सेट करता हूं जिसे मैं क्लिक कर रहा हूं। इस मामले में 1 से अधिक होने का अंत कभी खत्म नहीं होता है, इसलिए अधिक नवाइंटर कंट्रोलर खेल में नहीं आता है।

जब मैं अपने कस्टम नियंत्रक में प्रवेश करता हूं, तो मैं केवल पहले टैब को दृश्य नियंत्रकों के रूप में आपूर्ति करता हूं ताकि एप्लिकेशन लोड हो सके।

- (id) init { 
    self = [super init]; 
    if (self) { 
     self.delegate = self; 
     [self populateTabs]; 
    } 
    return self; 
} 

- (void) populateTabs { 
    NSArray *viewControllers = [self.manager createViewsForApplication]; 
    self.viewControllers = [NSArray arrayWithObject:[viewControllers objectAtIndex:0]]; 
    self.tabBar.hidden = YES; 
    MyScrollingTabBar *tabBar = [[MyScrollingTabBar alloc] initWithViews:viewControllers]; 
    tabBar.delegate = self; 
    [self.view addSubview:tabBar]; 
} 

स्पष्टता के लिए, टैबबार प्रतिनिधि इस वर्ग पर सेट है ताकि वह टैब क्लिक का जवाब दे सके। प्रतिनिधि विधि निम्नानुसार है:

- (void) tabBar:(id) bar clickedTab:(MyScrollingTabBarItem *) tab { 
     if (self.selectedViewController == tab.associatedViewController) { 
     [(UINavigationController *) tab.associatedViewController popToRootViewControllerAnimated:YES]; 
    } else { 
     self.selectedViewController = tab.associatedViewController; 
    } 
    // keep nav label consistent for tab 
    self.navigationController.title = tab.label.text; 
} 
+1

मैंने इसे थोड़ा अलग तरीके से किया, लेकिन केवल पहले व्यू कंट्रोलर को रखने और अन्य सभी को गतिशील रूप से लोड करने की आपकी अवधारणा का उपयोग किया। अच्छी तरह से किया! – Marquis103

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