एक नेविगेशन नियंत्रक के अंदर टैब बार नियंत्रक, या एक नेविगेशन रूट दृश्य साझा करना


80

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

तो, ऐसा लगता है कि कार्यान्वयन पदानुक्रम है:

  • UINavigationController
    1. खाते :UITableViewController
    2. UITabBarController
      1. ट्वीट :UITableViewController
        • एक ट्वीट / उपयोगकर्ता / आदि का विवरण देखें
      2. उत्तर :UITableViewController
      3. ...

यह काम करने के लिए लगता है [^ 1], लेकिन -pushViewController:animated:(जोर जोड़ा) के लिए एसडीके प्रलेखन के अनुसार असमर्थित प्रतीत होता है :

ViewController : दृश्य नियंत्रक कि ढेर पर धकेल दिया जाता है। यह टैब बार नियंत्रक का उदाहरण नहीं हो सकता।

मैं निजी APIs और पसंद से बचना चाहूंगा, लेकिन मुझे यकीन नहीं है कि जब यह ठीक काम करता है तब भी यह उपयोग स्पष्ट रूप से निषिद्ध है। किसी को कारण पता है?

मैंने टैब कंट्रोलर को मुख्य नियंत्रक के रूप में रखने के बारे में सोचा है, प्रत्येक टैब के साथ अलग नेविगेशन नियंत्रक होते हैं। इसके साथ समस्या यह है कि प्रत्येक नौसेना नियंत्रक को एक रूट व्यू कंट्रोलर (यानी ट्वीटी में "लेखा" तालिका ) को साझा करने की आवश्यकता है - यह काम नहीं करता है: तालिका नियंत्रक को एक दूसरे नौसेना नियंत्रक पर धकेलने के लिए इसे हटाने लगता है पहले से। एक अलग खाते का चयन करते समय सभी किताबों को रखने का उल्लेख नहीं करना शायद एक दर्द होगा।

मुझे यह सही तरीका कैसे लागू करना चाहिए?

[^ 1]: टैब बार नियंत्रक की जरूरत है ताकि subclassed जा सकता है कि चयनित टैब के मार्गदर्शक आइटम, और व्यक्तिगत टैब की तालिका नियंत्रक के लिए अपने-अपने विवरण दृश्य पुश करने के लिए जरूरत के साथ सिंक में उस स्तर रहता है पर टैब बार नियंत्रक के नेविगेशन आइटम self.tabBarController.navigationControllerके बजाय self.navigationController

जवाबों:


63

पिछले दो उत्तरों ने इसे सही पाया - मैं UITabBarControllerट्वीटी में उपयोग नहीं करता । यह एक कस्टम XXTabBarController(सादा उपवर्ग UIViewController) लिखना बहुत आसान है, जो एक नव नियंत्रक स्टैक पर धकेलने के लिए खुश है, लेकिन फिर भी "व्यू कंट्रोलर" दर्शन द्वारा रहता है। खाता-विशिष्ट दृश्य ( Tweets/ Replies/ Messages) पर प्रत्येक "टैब" का अपना दृश्य नियंत्रक है, और जहाँ तक वे चिंतित हैं, वे स्क्रीन पर एक सादे-ओल द्वारा स्वैप किए जा रहे हैं UITabBarController


2
कैसे अपने कस्टम टैब बार नियंत्रक वर्ग ने अपने बच्चे के नियंत्रकों के नेविगेशनआईटम और नेविगेशनकंट्रोलर गुणों के लिए पाइपलाइन को हैंडल किया है?
bvanderveen

क्या यह iOS 5 में बदल गया है? मुझे लगता है कि UITabBarController को एक UINavigationController में एक समस्या के बिना, यहां तक ​​कि रूट कंट्रोलर के रूप में जोड़ने में सक्षम होना चाहिए।
स्पार्क फाइंडर

33

मैं एक ऐसा ऐप बना रहा हूं, जो ट्वीटी के लिए एक समान नेविगेशन फ्रेमवर्क का उपयोग करता है। मैंने अपने ब्लॉग www.wiredbob.com पर ऐसा करने के बारे में एक पोस्ट लिखी है, जो स्रोत कोड से भी लिंक है। यह एक पूर्ण टेम्पलेट है जिसे आप किसी अन्य परियोजना के लिए आधार के रूप में ले सकते हैं और उपयोग कर सकते हैं। सौभाग्य!


10
सोच रहे लोगों के लिए, उल्लिखित ब्लॉग पोस्ट का लिंक wiredbob.com/blog/2009/4/20/… है
Anh

@ रॉबर्ट कॉन, वास्तव में अच्छा ट्यूटोरियल। मैं आपकी अवधारणा का उपयोग कर रहा हूं, लेकिन किसी कारण से मेरा टैबबार सक्रिय नहीं है। क्या आपके साथ ऐसा तब हुआ जब आप अपने ऐप को लागू कर रहे थे?
एक Salcedo

@ASalcedo: मुझे भी यह समस्या थी, लेकिन यह पाया गया कि यह इसलिए था क्योंकि टैब बार आइटम से जुड़े विचारों के आकार को कम करने के लिए, 460 की डिफ़ॉल्ट ऊंचाई का आकार बड़े पैमाने पर था, www.wiredbob.com के स्रोत कोड में आप देखेंगे कि टैब बार के लिए अनुमति देने के लिए टैब आइटम के लिए ऊँचाई 369 है। इंटरफ़ेस बिल्डर में ऊँचाई को बदलने के लिए आपको यह भी सुनिश्चित करना होगा कि स्थिति, ऊपर और नीचे पट्टी सभी को देखने के गुण निरीक्षक (तुरंत स्पष्ट नहीं) में कोई भी सेट नहीं है।
इजाक

2
ब्लॉग पोस्ट मेरे लिए मृत है, कोई भी मौका जो किसी के पास है?
टियागो वेलोसो

वर्किंग ब्लॉग पोस्ट लिंक: wiredbob.com/2009/04/iphone-tweetie-style-navigation.html
ऑलकुमैन

10

UITABBar को किसी भी UIViewController से जोड़ना संभव है। इस तरह आपको वास्तव में UITabBarController धक्का नहीं है और इसलिए Apple API के दिशानिर्देशों के भीतर रहना चाहिए।

इंटरफ़ेस निर्माता में UITabBar कोको टच लाइब्रेरी में "विंडोज, व्यूज़ एंड बार्स" के अंतर्गत है।


1
नमस्ते! @ हिमाद्री चौधरी आपको समझा सकते हैं "और इसलिए ऐप्पल एपीआई के दिशा निर्देशों के भीतर रहें" - या संदर्भ दें? मुझे यह नहीं मिल रहा है कि यह दिशानिर्देश कहां बताया गया है (मुझे संदेह नहीं है कि यह मौजूद है, लेकिन मुझे URL नहीं मिल सकता है)। बहुत बहुत धन्यवाद
darksider

10

मैं अपने ऐप के एक जोड़े में ऐसा करता हूं। एक नेविगेशन पट्टी के लिए एक टैब बार को जोड़ने के लिए ट्रिक आधारित ऐप का उपयोग नहीं करना है। दृश्य में एक टैब बार जोड़ें, उस दृश्य के लिए व्यू कंट्रोलर बनाएं एक TabBarDelegate, और व्यू कंट्रोलर के कोड में टैब बार पर उपयोगकर्ता चयनों का जवाब दें।

मैं टैब बार के दृश्य को उप-विचार के रूप में अतिरिक्त दृश्य जोड़ने के लिए, अलग-अलग डेटासेट के साथ एक टेबल दृश्य को फिर से लोड करने के लिए, एक UIPickerView, आदि को पुनः लोड करने के लिए टैब बार्स का उपयोग करता हूं।


6

मैं इसे लागू करने के लिए पिछले एक घंटे से संघर्ष कर रहा था UITabBarक्योंकि जब मैं अपना दृष्टिकोण प्रदर्शित करने की कोशिश करता तो वह छिप जाता; तब मुझे यह पोस्ट मिली :

मूल रूप से, सुनिश्चित करें कि आपने इस कोड के अनुसार, अपना नया दृश्य टैब्बर के नीचे डाला है:

[self.view insertSubview:tab2ViewController.view belowSubview:myTabBar];

धन्यवाद इससे मेरी गायब टैब पट्टी को ठीक करने में मदद मिली। मैंने उसी कोड का उपयोग किया जो रॉबर्ट कॉन ने प्रस्तावित किया था लेकिन किसी तरह ui टैब बार गायब हो जाता है जब मैं दूसरे दृश्य पर स्विच करता हूं।
विजय कटम

3

मेरे ऐप में, रूट व्यू कंट्रोलर एक UINavigation कंट्रोलर है। एप्लिकेशन में एक निश्चित बिंदु पर, मुझे UITabBar प्रदर्शित करने की आवश्यकता है। मैंने नेविगेशन पदानुक्रम के भीतर एक UIView पर एक UITabBar को लागू करने की कोशिश की, जैसा कि पिछले कुछ पदों ने सुझाव दिया था, और यह काम करता है। लेकिन मैंने पाया कि मैं डिफ़ॉल्ट व्यवहार के बारे में अधिक चाहता था जो टैब नियंत्रक प्रदान करता है और मुझे यूआईएनबीटी कंट्रोलर के साथ UITabBarController का उपयोग करने का एक तरीका मिला:

1) जब मैं UITabBarController का दृश्य प्रदर्शित करना चाहता हूं, तो मैं यह करता हूं:

MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
appDelegate.window.rootViewController = myUiTabBarControllerInstance;

2) जब मैं नेविगेशन पदानुक्रम में जहां था वहां वापस जाना चाहता हूं, तो मैं यह करता हूं:

appDelegate.window.rootViewController = myNavControllerInstance;

3

यह केवल नेविगेशन कंट्रोलर में TabBarController एम्बेड करके प्राप्त किया जा सकता है। स्टोरीबोर्ड में:

  1. एक ViewController खींचें
  2. ViewController के दृश्य पर क्लिक करें
  3. एडिटर पर क्लिक करें >> एंबेड >> नेवीगेशन कंट्रोलर।
  4. एक ही ViewController पर एक बटन खींचें।
  5. एक TabBarController खींचें
  6. पुश सीगर एक्शन के माध्यम से व्यू कॉन्ट्रोलर से टैबबरकंट्रोलर पर बटन कनेक्ट करें।

इस मामले में केवल TabBarController का RootViewController नेविगेशन कंट्रोलर के स्टैक में होगा। सभी TabBarItems के शीर्ष पर नेविगेशन बार होगा और उपयोगकर्ता किसी भी समय होम स्क्रीन पर जा सकता है, भले ही चयनित TabBarItem हो

यह नेविगेशन कंट्रोलर के स्टैक में किसी भी ViewController पर किया जा सकता है।

यदि यह काम करता है, तो कृपया मुझे सुझाव दें कि प्रतिष्ठा कैसे बढ़ाएं ताकि मैं अगले उत्तर में छवियों और कोड को पोस्ट कर सकूं। :)


3

मैंने इस तरह से इसे किया। यह वास्तव में नेविगेशन नियंत्रक पर एक tabbarcontroller धक्का है। यह बढ़िया काम करता है। मैं कहीं भी दस्तावेज में नहीं पाया कि सेब इस तरह से समर्थन नहीं करता है। क्या कोई मुझे इस चेतावनी का लिंक दे सकता है?

यदि यह सत्य है, तो क्या यह संभव है कि ऐप्पस्टोर ऐप को प्रकाशित करने से इनकार कर दे?

-(void)setArrayAndPushNextController
{
    MyFirstViewController *myFirstViewController = [[MyFirstViewController alloc] init];
    MySecondViewController *mySecondViewController = [[MySecondViewController alloc] init];

    myFirstViewController.array = self.array;


    NSArray *array = [[NSArray alloc] initWithObjects:myFirstViewController, mySecondViewController, nil];
    UITabBarController *tab = [[UITabBarController alloc] init];
    tab.viewControllers = array;

    [array release];

    UITabBarItem *item1 = [[UITabBarItem alloc] initWithTitle:@"first title" image:nil tag:1];
    UITabBarItem *item2 = [[UITabBarItem alloc] initWithTitle:@"second title" image:nil tag:2];

    myFirstViewController.tabBarItem = item1;
    mySecondViewController.tabBarItem = item2;

    [self stopAnimatingSpinner];

    [self.navigationController pushViewController:tab animated:YES];

    [tab release];
    [item1 release];
    [item2 release];
}

आप अपने UIViewControllers
Gargo

1

मैंने एक ब्लॉग पोस्ट लिखी कि कैसे मैंने इस समस्या से संपर्क किया। मेरे लिए, एक सामान्य दृश्य का उपयोग करना कस्टम टैब-बार कार्यान्वयन लिखने की तुलना में एक सरल समाधान था।

http://www.alexmedearis.com/uitabbarcontroller-inside-a-uinavigationcontroller/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.