2011-03-24 91 views
125

假設我在我的iPhone應用程序的一個選項卡視圖中有一個UIButton,我想讓它在TabBarController的選項卡欄中打開不同的選項卡。我會如何編寫代碼來做到這一點?以編程方式切換到TabBar選項卡視圖?

我假設我卸載現有的視圖並加載特定的選項卡視圖,但我不知道如何精確地編寫代碼。

+0

我有上面的方法的問題,在我的[問題] [1] [1]:http:// stackoverflow。com/questions/19742416/tabbarcontroller-unload-itself-after-call-modalview – 2013-11-02 18:54:27

回答

322

試試這個:

self.tabBarController.selectedIndex = 1; 

[self.tabBarController setSelectedIndex:1]; 
+4

完美,謝謝。儘管每個人都給出了正確的答案,所有人都贊同! – rottendevice 2011-03-24 16:39:09

+4

請注意,如果索引映射到「更多」視圖控制器中的一個選項卡(如果您的選項卡多於五個),這將不起作用。在這種情況下,使用'-setSelectedViewController:'。 – 2012-03-02 15:43:43

+0

我這樣做後,它成功地更改了標籤,我不能再正常選擇標籤欄。更新:這是在我以編程方式交換選項卡之前調用popToRootViewController的某種方式。 – 2014-05-13 03:35:41

9

您可以簡單地將UITabBarController上的selectedIndex屬性設置爲適當的索引,並且該視圖將像用戶點擊選項卡按鈕一樣更改。

+4

由於一個小的區別是可以通知用戶切換選項卡的委託方法未被調用。 – 2011-05-13 17:58:22

+3

設置'selectedIndex'對我來說也不適用於索引> 4,但'selectedViewController'。 – bugloaf 2012-08-14 16:33:58

19

注意標籤被索引從0開始所以下面的代碼片段工作

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

進入到第五個標籤在酒吧。

+2

thnx男人,你救我的4至5小時... – Ayaz 2013-08-16 06:50:21

8

我的意見是selectedIndex或使用objectAtIndex不一定是切換選項卡的最佳方式。如果您重新排列標籤,硬編碼索引選擇可能會混淆以前的應用程序行爲。

如果您想要切換到視圖控制器的對象引用,你可以這樣做:

tabBarController.selectedViewController = myViewController 

當然,你必須確保,即myViewController真的是在tabBarController.viewControllers列表。

+0

我需要選擇moreNavController,這是唯一的方法做到這一點,據我所知 – Ossir 2016-06-24 13:52:17

+0

應該是正確的答案! – Ludovic 2016-07-02 12:37:20

2

對於您可能要移動標籤的情況,下面是一些代碼。

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

我試過迪斯科S2的建議,它很接近,但這是結束了爲我工作。這是在完成另一個選項卡中的操作後調用的。

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

我希望能夠以指定標籤是由類,而不是指數顯示,因爲我認爲這對於一個強大的解決方案,這是較少依賴於你如何線了IB製成。我沒有找到任何迪斯科的或Joped的解決方案的工作,所以我創造了這個方法:

-(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]]; 

希望這是有益的人

0

使用中AppDelegate.m file:

(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; 

    } 

} 
相關問題