我有一个标签栏应用程序,我需要知道用户点击标签栏的时间和按钮,以显示相应的通知等。
简而言之:我如何在UITabBar上检测点击的UITabBarItem的索引?
提前致谢!
答案取决于UITabBar是否由UITabBarController管理。
案例1 - UITabBar已由UITabBarController处理
实施UITabBarControllerDelegate
协议。特别是tabBarContoller:didSelectViewController:
方法。设置实现协议的类的实例作为delegate
的UITabBarController
。
- (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:
方法。设置实现协议的类的实例作为delegate
的UITabBar
。
- (void)tabBar:(UITabBar *)theTabBar didSelectItem:(UITabBarItem *)item {
NSUInteger indexOfTab = [[theTabBar items] indexOfObject:item];
NSLog(@"Tab index = %u", (int)indexOfTab);
}
编辑:修改方法参数变量以消除关于tabBarController
被隐藏的OP的编译警告。
SWIFT 3:
// 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))")
}
在UITabBarDelegate
协议中定义了一个名为tabBar:didSelectItem:
的方法,该方法将通知您选择(点击)UITabBarItem
的时间和时间。
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
}
我是这样做的:这是一个扩展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]);
}