检测以编程方式

时间:2015-06-07 09:57:20

标签: ios uitabbarcontroller uitabbar uitabbaritem

我想知道我们如何检测选定的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")
}

7 个答案:

答案 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] {

    }
}