我想知道我们如何检测选定的TabBar项目或索引何时更改 何时 以编程方式完成更改 ?
self.tabBarController.selectedIndex = 1;
此两个委托功能仅在用户选择tabBar项时检测更改。当以编程方式完成对selectedIndex的更改时,它不会触发。
func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
println("tabBarController didSelectViewController")
}
override func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem!) {
println("tabBar didSelectItem")
}
答案 0 :(得分:14)
以前的答案足以“检测”更改,但是它不会检测到正在按下哪个索引。
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
}
}
答案 1 :(得分:2)
在swift中,您可以通过覆盖selectedIndex
的{{1}}属性来完成此操作。
第一个子类UITabBarController
并添加以下所有代码。
UITabBarController
同时添加//Overriding this to get callback whenever its value is changes
override var selectedIndex: Int {
didSet {
handleTabSelection(selectedIndex: selectedIndex)
}
}
UITabBarControllerDelegate
最后,我们从两个地方调用此方法,以便处理所有案例。
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
//Tab tapped
guard let viewControllers = tabBarController.viewControllers else { return }
let tappedIndex = viewControllers.index(of: viewController)!
//Tab tapped at tappedIndex
handleTabSelection(selectedIndex: tappedIndex)
}
答案 2 :(得分:1)
这是无法做到的,但可以做一些黑客攻击,我相信这将成为解决这个问题的临时解决方案。 覆盖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
}
答案 3 :(得分:1)
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)
答案 4 :(得分:0)
我找到了一个可爱的解决方案。感谢Ckouta的想法。
我只是创建一个函数来更改索引并触发UITabBar的didSelectItem的委托协议
func selectItemWithIndex(value: Int) {
self.tabBarControllertabBarController.selectedIndex = value;
self.tabBar(self.tabBar, didSelectItem: (self.tabBar.items as! [UITabBarItem])[value]);
}
用法
selectItemWithIndex(1);
答案 5 :(得分:0)
我只关心标签栏控制器堆栈中的一个VC中的selectedIndex。所以我KVO:来自该VC的tabbarcontroller实例上的ed segmentedIndex。效果很好,没有真正的问题。
答案 6 :(得分:-1)
快捷键4:-您必须使用以下代码行来检测UITabBar所选项目的索引。
func tabBar(_ tabBar:UITabBar,didSelect item:UITabBarItem){
if item == (tabBar.items)![0] {
}
else if item == (tabBar.items)![1] {
}
}