检测UITabBar选定的索引/项目更改以编程方式设置

我想知道 编程完成所做的更改 如何检测选定的TabBar项目或索引是否更改?

self.tabBarController.selectedIndex = 1; 

这两个代表function只检测用户selecttabBar项目时的变化。 当对selectedIndex的更改以编程方式完成时,它不会触发。

 func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) { println("tabBarController didSelectViewController") } override func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem!) { println("tabBar didSelectItem") } 

以前的答案足以“检测”更改,但不会检测到正在按下哪个索引。

 func selectItemWithIndex(value: Int) { self.tabBarControllertabBarController.selectedIndex = value; self.tabBar(self.tabBar, didSelectItem: (self.tabBar.items as! [UITabBarItem])[value]); } 

self.selectedIndex不会立即返回所选的索引。 要检查哪个项目被按下,我们需要比较项目与我们的UITabBarController tabBarItems

 override func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem!) { if item == (self.tabBar.items as! [UITabBarItem])[0]{ //Do something if index is 0 } else if item == (self.tabBar.items as! [UITabBarItem])[1]{ //Do something if index is 1 } } 

比不能做,但有些黑客可以做,我相信这将是这个问题的临时解决scheme。 覆盖下面的方法为tabbarcontrollerdelegate做你的东西在这个被调用时,以任何方式切换标签编程方式或点击标签栏项目。

 func tabBarController(_ tabBarController: UITabBarController, animationControllerForTransitionFrom fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? { toVC.tabBarItem.setTitleTextAttributes([NSFontAttributeName: UIFont.fontFuturaMedium11, NSForegroundColorAttributeName: UIColor.colorAppThemeColor], for: .normal) fromVC.tabBarItem.setTitleTextAttributes([NSFontAttributeName: UIFont.fontFuturaBTBook11, NSForegroundColorAttributeName: UIColor.colorStudentTabText], for: .normal) return nil } 

我find了一个可爱的解决scheme。 感谢Couta的想法。

我只是创build一个函数来改变索引,并触发UITabBar的didSelectItem的委托协议

 func selectItemWithIndex(value: Int) { self.tabBarControllertabBarController.selectedIndex = value; self.tabBar(self.tabBar, didSelectItem: (self.tabBar.items as! [UITabBarItem])[value]); } 

用法

  selectItemWithIndex(1); 

我只关心标签栏控制器堆栈中的一个VC中的selectedIndex。 所以我KVO:编辑从该VC的tabbarcontroller实例segmentedIndex。 运作良好,没有真正的问题。

Swift 3

这里有一个比较安全的Swift-3版本,这个版本是上面提出的:

 func selectItem(withIndex index: Int) { if let controller = tabBarController, let tabBar = tabBarController?.tabBar, let items = tabBarController?.tabBar.items { guard index < items.count else { return } controller.selectedIndex = index controller.tabBar(tabBar, didSelect: items[index]) } } 

的UITabBarController:

 override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) { if let items = tabBar.items { items.enumerated().forEach { if $1 == item { print("your index is: \($0)") } } } } 

用法:

 selectItem(withIndex: 1)