2011-05-04 31 views
17

我有一個標籤欄爲基礎的應用程序,與超過5個標籤欄項目 - 所以我得到他們4直接顯示在視圖和其他可用通過選擇「更多」標籤。當一個標籤欄項目被按下時,我想要檢測哪一個是它。
所以,在
- (void)tabBarController:(UITabBarController *)tabBarCtrl didSelectViewController:(UIViewController *)viewController方法,我使用tabBarCtrl.selectedViewController.title獲得項目的標題。iphone應用程序 - 檢測哪個標籤欄項目被按下

這適用於在視圖中可見的選項卡 - 這是第一個4和「更多」選項卡 - 但不適用於按下「更多」按鈕後顯示在列表中的其他選項卡欄項目,標籤。

從「更多」列表中選擇選項卡時,我可以看到didSelectViewController方法甚至沒有被調用。
如何在按下時檢測它們中的任何一個?

預先感謝您。

回答

20

How to get title of UITabBarItem in the More section?

- (void)tabBarController:(UITabBarController *)tabBarController 
didSelectViewController:(UIViewController *)viewController 
{ 
    NSLog(@"controller class: %@", NSStringFromClass([viewController class])); 
    NSLog(@"controller title: %@", viewController.title); 

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

謝謝MacDev!我現在是有道理的......而且我一直在尋找超過2個小時,但沒有發現這個問題! – CrisDeBlonde 2011-05-04 15:38:12

+0

但它仍然不會調用「didSelectViewController」並生成警告。 – 2015-07-09 09:40:07

5

當一個選項卡已被使用UITabBarDelegate方法按下您可以檢測:http://developer.apple.com/library/ios/#documentation/uikit/reference/UITabBarDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intf/UITabBarDelegate

你可以讓你的UITabBarController類是委託並在實施添加方法:

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item 
{ 
    NSLog(@"tab selected: %@", item.title); 
} 
+0

的didSelectItem方法看起來像它實際上是選擇的項目之前接到電話和shouldSelectViewController之前。當用戶從more表中選擇一個項目時,它似乎不會被調用。 – 2012-04-09 20:55:14

+0

如果tabBar由UITabBarController管理,則無法將UITabBar與您自己的代理連接 – 2015-07-20 16:49:56

+0

謝謝!它正在工作。 – Raja 2017-05-16 11:16:01

1

如果您使用的是標籤欄控制器,您應該避免瞭解標籤項與視圖控制器 - 這是標籤欄控制器的工作。如果你想使用標籤欄作爲別的東西,那麼你應該直接使用UITabBar,而不是使用UITabBarController。如果您使用UITabBar,您可以將自己的對象設置爲選項卡欄的代表,然後委託人隨後會在所選項目發生更改時收到消息。

13

您可以使用UIViewController中的以下代碼訪問所選項目的索引。它會總是返回標籤的索引。

self.tabBarController.selectedIndex; 

所以,如果你有例如6項你可以去「更多...」標籤,選擇你的「第5」項目和selectedIndex將是。如果您轉到更多選項卡並選擇第6項,則會返回。


編輯:如果你想查一些UITabBarItem的當前位置,你可以這樣做:

首先,在你的XIB文件,你應該編輯每個選項卡的tag屬性,因此第1片將具有標籤= 100,第二 - 200,第三 - 300等

如果是的ViewController添加以下代碼:

UIViewController *selectedVC = [self.tabBarController.viewControllers objectAtIndex:self.tabBarController.selectedIndex]; 
int selectedItemTag = selectedVC.tabItem.tag; 

然後你可以通過使用selectedItemTag變量來確定它是什麼viewController。在這種情況下,您可以通過doint來確定selectedIndex:selectedIndex = (selectedItemTag-100)/100

tag屬性自定義UITabBar時改變,所以你可以,如果你正在使用的UITabBarController可以使類實現UITabBarControllerDelegate信任他們:)

+2

你好卡夏夫。您的方法聽起來不錯,但是用戶無法重新排列標籤欄項目?然後每個項目的索引將會改變。 – CrisDeBlonde 2011-05-04 15:33:06

+0

然後我馬上編輯我的答案,因爲我知道如何處理它。 – akashivskyy 2011-05-04 15:37:54

3

所以和將您的UITabBarController代理設置爲TabBar所選項目更改時需要通知的類,然後將代理方法添加到您的類中:

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

在此方法中可以使用的UITabBarController selectedIndex屬性就知道這是選擇當前索引:

-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:  (UIViewController *)viewController 
{ 
    NSLog(@"Selected index: %d", tabBarController.selectedIndex); 
} 

2.如果您不使用不僅僅是UITabBar可以由Ken Pespisa這裏遵循的答案和iCoder在這篇文章中Ken Pespisa and iCoder

2

由於您將標記添加到您的每個UITabBarItem(即使索引5和更多)。

您可以跟蹤使用下面的代碼選擇了哪一選項卡:

//MARK: - UITabBarControllerDelegate 

func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) { 

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


//MARK: - UINavigationControllerDelegate 

func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) { 
    setSelectedTabBarOption() 
} 


private func setSelectedTabBarOption() { 

    if let viewControllers = viewControllers { 
     let selectedController: UIViewController? = viewControllers.count > selectedIndex ? viewControllers[selectedIndex] : nil 
     if let tag = selectedController?.tabBarItem.tag { 
      //do whatever with your tag 
     } 
    } 
} 
2
- (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 tabitem %u",self.tabBarController.selectedIndex); 
     break; 
    case 1: 
     NSLog(@"click me again!! %u",self.tabBarController.selectedIndex); 
     break; 

    default: 
     break; 

} 

}