टैबबार टैब दृश्य पर प्रोग्रामेटिक रूप से स्विच करना?


159

मान लीजिए कि UIButtonमेरे iPhone ऐप में मेरा एक टैब दृश्य है, और मैं चाहता हूं कि यह टैब टैब में एक अलग टैब खोलें TabBarController। मैं ऐसा करने के लिए कोड कैसे लिखूंगा?

मैं मान रहा हूं कि मैं मौजूदा दृश्य को लोड कर रहा हूं और एक विशिष्ट टैब दृश्य लोड कर रहा हूं, लेकिन मुझे यकीन नहीं है कि कोड को बिल्कुल कैसे लिखा जाए।


मुझे ऊपर दिए गए तरीकों से समस्या है, लोग मेरे [सवाल] [1] [1] में मदद करते हैं: stackoverflow.com/questions/19742416/…
रोमन सिमेनोक

जवाबों:


399

इस कोड को स्विफ्ट या ऑब्जेक्टिव-सी में आज़माएं

तीव्र

self.tabBarController.selectedIndex = 1

उद्देश्य सी

[self.tabBarController setSelectedIndex:1];

8
ध्यान दें, यदि सूचकांक अधिक दृश्य नियंत्रक के भीतर एक टैब पर मैप करता है (आपको पांच टैब से अधिक होना चाहिए), तो यह काम नहीं करेगा। उस मामले में, का उपयोग करें -setSelectedViewController:
जो डी'आंड्रिया

ऐसा करने के बाद और यह टैब सफलतापूर्वक बदल जाता है, मैं अब सामान्य रूप से टैब बार का चयन नहीं कर सकता। अद्यतन: इससे पहले कि मैं प्रोग्राम टैब को स्वैप कर लेता, यह किसी तरह से popToRootViewController कॉलिंग से संबंधित था।
एडम जॉन्स

लेकिन अगर मैं टैब स्विच करना चाहता हूं तो सेल्फ वॉन्ट कैसे काम करेगा। मान लें कि मैं टैब 3 पर क्लिक करता हूं और अब अलर्ट देखें। जैसे ही यूजर प्रेस ओके करता है, मैं टैब 1 पर फिर से स्विच करना चाहता हूं। आत्म अभ्यस्त सही होना चाहिए क्योंकि इसकी वर्तमान वस्तु नहीं है। सही बात ?
एलिक्स

यह अच्छी तरह से काम करता है लेकिन मुझे टैब स्विच करते समय डेटा भी पास करना होगा। मुझे टैब में एक लेबल मिला है जहां मैं टैब को स्विच करते ही अपडेट करने की आवश्यकता है। इसका कोई आसान उपाय?
एमडी रईस

@AdamJohns आपने अपनी समस्या को हल करने का प्रबंधन कैसे किया। देशी टैबबार की तरह व्यवहार करना। यह दूसरे क्लिक पर rootViewController के लिए पॉप चाहिए।
वकास

20

ध्यान दें कि टैब 0. से शुरू किए गए अनुक्रमित हैं इसलिए निम्न कोड स्निपेट काम करता है

tabBarController = [[UITabBarController alloc] init];
.
.
.
tabBarController.selectedViewController = [tabBarController.viewControllers objectAtIndex:4];

बार में पांचवें टैब पर जाता है।


12

मेरी राय है कि selectedIndexया objectAtIndexटैब को स्विच करने का सबसे अच्छा तरीका जरूरी नहीं है। यदि आप अपने टैब को फिर से व्यवस्थित करते हैं, तो हार्ड कोडित इंडेक्स चयन आपके पूर्व ऐप व्यवहार के साथ गड़बड़ कर सकता है।

यदि आपके पास उस दृश्य नियंत्रक का ऑब्जेक्ट संदर्भ है जिसे आप स्विच करना चाहते हैं, तो आप कर सकते हैं:

tabBarController.selectedViewController = myViewController

बेशक आपको यह सुनिश्चित करना चाहिए, कि myViewControllerवास्तव में की सूची में है tabBarController.viewControllers


मुझे और अधिक का चयन करने की आवश्यकता हैकंट्रोलर और ऐसा करने का एकमात्र तरीका है जहाँ तक मुझे पता है
Ossir

9

आप बस selectedIndexUITabBarController पर संपत्ति को उचित सूचकांक में सेट कर सकते हैं और उपयोगकर्ता टैब बटन टैप करने पर दृश्य बदल जाएगा।


6
एक छोटे से अंतर के साथ कि उपयोगकर्ता स्विचिंग टैब को सूचित कर सकने वाली प्रतिनिधि पद्धति को नहीं कहा जाता है।
ब्रैड द एप गाय

3
सेटिंग selectedIndexभी मेरे लिए अनुक्रमित> 4 के साथ काम नहीं करता है, लेकिन selectedViewControllerकरता है।
Bugloaf

3

मैंने कोशिश की कि डिस्को एस 2 ने क्या सुझाव दिया, यह करीब था लेकिन यह वही है जो मेरे लिए काम कर रहा है। यह एक अन्य टैब के अंदर एक कार्रवाई को पूरा करने के बाद बुलाया गया था।

for (UINavigationController *controller in self.tabBarController.viewControllers)
{
    if ([controller isKindOfClass:[MyViewController class]])
    {
        [self.tabBarController setSelectedViewController:controller];
        break;
    }
}

2

उन मामलों के लिए जहां आप टैब को स्थानांतरित कर रहे हैं, यहां कुछ कोड है।

for ( UINavigationController *controller in self.tabBarController.viewControllers ) {
            if ( [[controller.childViewControllers objectAtIndex:0] isKindOfClass:[MyViewController class]]) {
                [self.tabBarController setSelectedViewController:controller];
                break;
            }
        }

2

स्टुअर्ट क्लार्क के समाधान की तरह लेकिन स्विफ्ट 3 के लिए:

func setTab<T>(_ myClass: T.Type) {
    var i: Int = 0
    if let controllers = self.tabBarController?.viewControllers {
        for controller in controllers {
            if let nav = controller as? UINavigationController, nav.topViewController is T {
                break
            }
            i = i+1
        }
    }
    self.tabBarController?.selectedIndex = i
}

इसे इस तरह उपयोग करें:

setTab(MyViewController.self)

कृपया ध्यान दें कि मेरा टैबकंट्रोलर नेविगेशनकंट्रोलर के पीछे देखने के लिए लिंक करता है। बिना नेविगेशनकंट्रोलर के यह इस तरह दिखेगा:

if let controller is T {

पाशन, कोई नेविगेशन नियंत्रक के बिना: समारोह selectViewController <ViewControllerModel> (प्रकार: ViewControllerModel.Type) {self.selectedViewController = self.viewControllers प्रथम (जहां: {ViewController में ViewController ViewControllerModel} है)?}
dev_exo

1

मैं यह निर्दिष्ट करना चाहता था कि कौन सा टैब इंडेक्स के बजाय कक्षा द्वारा दिखाया गया था क्योंकि मुझे लगा था कि यह एक मजबूत समाधान के लिए बनाया गया था जो कि आईबी को तार करने के तरीके पर कम निर्भर था। मुझे डिस्को का या जोपेड का समाधान काम नहीं आया इसलिए मैंने यह विधि बनाई:

-(void)setTab:(Class)class{
    int i = 0;
    for (UINavigationController *controller in self.tabBarContontroller.viewControllers){
        if ([controller isKindOfClass:class]){
            break;
        }
        i++;
    }
    self.tabBarContontroller.selectedIndex = i;
}

आप इसे इस तरह कहते हैं:

[self setTab:[YourClass class]];

आशा है कि यह किसी के लिए उपयोगी है


यह महान काम किया! मैंने इसे एक अन्य उत्तर में स्विफ्ट 3 के लिए फिर से लिखा।
Json

1

मेरा मुद्दा थोड़ा अलग है, मुझे 2 टैबबार में घर के व्यू कॉन्ट्रोलर से 1 टैबबार में एक चाइल्ड व्यू कॉन्ट्रोलर से स्विच करने की आवश्यकता है। मैं बस ऊपर दिए गए समाधान का उपयोग करता हूं:

tabBarController.selectedIndex = 2

हालाँकि जब यह दूसरे टैबबार के मुख पृष्ठ पर जाता है, तो सामग्री अदृश्य होती है। और जब मैं डीबग करता हूं, viewDidAppear, viewWillAppear, viewDidLoad, उनमें से कोई भी कॉल नहीं किया जाता है। मेरा समाधान UITabBarController में निम्नलिखित कोड जोड़ना है:

override var shouldAutomaticallyForwardAppearanceMethods: Bool 
{
    return true
}

0

AppDelegate.mफ़ाइल में उपयोग करें :

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

     NSLog(@"Selected index: %d", tabBarController.selectedIndex);

    if (viewController == tabBarController.moreNavigationController)
    {
        tabBarController.moreNavigationController.delegate = self;
    }

    NSUInteger selectedIndex = tabBarController.selectedIndex;

    switch (selectedIndex) {

        case 0:
            NSLog(@"click me %u",self.tabBarController.selectedIndex);
            break;
        case 1:
            NSLog(@"click me again!! %u",self.tabBarController.selectedIndex);
            break;

        default:
            break;

    }

}

0

स्टुअर्ट क्लार्क के समाधान की तरह लेकिन स्विफ्ट 3 के लिए और सही टैब खोजने के लिए पुनर्स्थापना पहचानकर्ता का उपयोग करना:

private func setTabById(id: String) {
  var i: Int = 0
  if let controllers = self.tabBarController?.viewControllers {
    for controller in controllers {
      if let nav = controller as? UINavigationController, nav.topViewController?.restorationIdentifier == id {
        break
      }
      i = i+1
    }
  }
  self.tabBarController?.selectedIndex = i
}

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

struct Tabs {
    static let Humans = "Humans"
    static let Robots = "Robots"
}
setTabById(id: Tabs.Robots)

कृपया ध्यान दें कि मेरा टैबकंट्रोलर नेविगेशनकंट्रोलर के पीछे देखने के लिए लिंक करता है। बिना नेविगेशनकंट्रोलर के यह इस तरह दिखेगा:

if controller.restorationIdentifier == id {

0
import UIKit

class TabbarViewController: UITabBarController,UITabBarControllerDelegate {

//MARK:- View Life Cycle

override func viewDidLoad() {
    super.viewDidLoad()

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

}

//Tabbar delegate method
override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
    let yourView = self.viewControllers![self.selectedIndex] as! UINavigationController
    yourView.popToRootViewController(animated:false)
}



}

1
आमतौर पर अनाम कोड की कुछ पंक्तियों को पोस्ट करने के बजाय किसी समाधान की व्याख्या करना बेहतर होता है। आप पढ़ सकते हैं कि मैं एक अच्छा उत्तर कैसे लिखूं , और पूरी तरह से कोड-आधारित उत्तरों की व्याख्या करना
Anh Pham
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.