【问题标题】:UITabBar(Controller) - Get index of tapped?UITabBar(Controller) - 获取被点击的索引?
【发布时间】:2011-04-15 12:56:21
【问题描述】:

我有一个标签栏应用程序,我需要知道用户何时以及在标签栏上点击什么按钮以显示适当的通知等。

简而言之:我将如何检测 UITabBar 上被点击的 UITabBarItem 的索引?

提前致谢!

【问题讨论】:

标签: iphone objective-c cocoa-touch uitabbarcontroller


【解决方案1】:

UITabBarDelegate 协议中定义了一个名为tabBar:didSelectItem: 的方法,它会通知您选择(点击)UITabBarItem 的时间和地点。

【讨论】:

    【解决方案2】:

    答案取决于 UITabBar 是否由 UITabBarController 管理。

    案例 1 - UITabBar 已由 UITabBarController 处理

    实现UITabBarControllerDelegate 协议。特别是tabBarContoller:didSelectViewController: 方法。将实现协议的类的实例设置为delegateUITabBarController

    - (void)tabBarController:(UITabBarController *)theTabBarController didSelectViewController:(UIViewController *)viewController {
        NSUInteger indexOfTab = [theTabBarController.viewControllers indexOfObject:viewController];
        NSLog(@"Tab index = %u (%u)", (int)indexOfTab);
    }
    

    在这种情况下,您必须注意标签控制器中有足够的控制器以显示“更多”标签的特殊情况。在这种情况下,您将收到对 tabBarController:didSelectViewController: 的调用,其中包含不在列表中的视图控制器(它是内部 UIKit 类 UIMoreNavigationController 的实例)。在这种情况下,我示例中的indexOfTab 将是NSNotFound

    案例 2 - UITabBar 尚未由 UITabBarController 处理

    实现UITabBarDelegate 协议。特别是tabBar:didSelectItem: 方法。将实现协议的类的实例设置为UITabBardelegate

    - (void)tabBar:(UITabBar *)theTabBar didSelectItem:(UITabBarItem *)item {
        NSUInteger indexOfTab = [[theTabBar items] indexOfObject:item];
        NSLog(@"Tab index = %u", (int)indexOfTab);
    }
    

    编辑:修改方法参数变量以消除 OP 关于 tabBarController 被隐藏的编译警告。

    【讨论】:

    • 对不起,你怎么知道你是哪种情况?
    【解决方案3】:

    我是这样做的: 这是在扩展 UITabBarController 的自定义类中

    .h

    @interface CustomTabBarController : UITabBarController<UITabBarDelegate>
    

    .m

    -(void)tabBar:(UITabBar *)theTabBar didSelectItem:(UIViewController *)viewController
    {
        NSLog(@"Tab index = %@ ", theTabBar.selectedItem);
        for(int i = 0; i < theTabBar.items.count; i++)
        {
            if(theTabBar.selectedItem == theTabBar.items[i])
            {
                NSLog(@"%d",i);// this will give the selected tab
            }
    
        }
        //NSlog(@"Items = %@", theTabBar.items[0]);
    }
    

    【讨论】:

      【解决方案4】:

      斯威夫特:

      // somewhere inside your TabBarViewController
      //...
      override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
          let indexOfTab = tabBar.items?.index(of: item)
          print("pressed tabBar: \(String(describing: indexOfTab))")
      }
      

      【讨论】:

        【解决方案5】:

        SWIFT 4:

        我更喜欢

        // somewhere inside your TabBarViewController
        //...
        func tabBarController(_ tabBarController: UITabBarController, 
                          shouldSelect viewController: UIViewController) -> Bool{
            let index = tabBarController.viewControllers?.index(of: viewController)
            return true// you decide
        }
        

        【讨论】:

          【解决方案6】:

          Swift 4 的简单扩展:

          extension UITabBarController {
              func getSelectedTabIndex() -> Int? {
                  if let selectedItem = self.tabBar.selectedItem {
                      return self.tabBar.items?.firstIndex(of: selectedItem)
                  }
                  return nil
              }
          }
          

          及用法:

          let index = getSelectedTabIndex()
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-02-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-11-20
            • 2017-02-23
            • 1970-01-01
            相关资源
            最近更新 更多