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


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

6865
2018-06-07 09:57


起源



答案:


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

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

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

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
    }
}

10
2018-06-08 03:01





在这里的所有答案,如果您继承 UITabBarController 已经,这是一个简单的解决方案,用于所有标签栏更改(用户启动和编程):

// Override selectedViewController for User initiated changes
override var selectedViewController: UIViewController? {
    didSet {
        tabChangedTo(selectedIndex: selectedIndex)
    }
}
// Override selectedIndex for Programmatic changes    
override var selectedIndex: Int {
    didSet {
        tabChangedTo(selectedIndex: selectedIndex)
    }
}

// handle new selection
 func tabChangedTo(selectedIndex: Int) {}

3
2018-02-25 14:25





除了无法做到,但可以做一些黑客攻击,我相信这将成为这个问题的临时解决方案。 在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
}

1
2018-05-31 09:23





斯威夫特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)

1
2017-08-03 18:56





我找到了一个可爱的解决方案。感谢Ckouta的想法。

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

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

用法

    selectItemWithIndex(1);

0
2018-06-07 10:53





我只关心标签栏控制器堆栈中的一个VC中的selectedIndex。所以我KVO:来自该VC的tabbarcontroller实例上的ed segmentedIndex。效果很好,没有实际问题。


0
2018-06-01 14:23





在swift中,你可以通过覆盖来实现 selectedIndex 的财产 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)
}

最后,我们从两个地方调用此方法,以便处理所有案例。

private func handleTabSelection(selectedIndex: Int) {
    //Do something on tab selection at selectedIndex
}

0
2018-02-15 18:16