iOS UITabBar使“假”活动选项卡?

时间:2018-09-20 08:50:07

标签: ios swift

UITabBar是否可以仅更改活动标签图标?

假设我有5个标签,第1个处于活动状态。我现在想使第二个图标处于活动状态,而就TabBar而言,不更改任何其他内容,仅更改该图标即可。

每当我尝试突出显示第二个图标时,TabBar都会切换控制器,并且如果没有(代表替代),图标的也不会改变。有什么办法可以使选项卡保持活动状态,而只有图标不处于活动状态?

我为什么要问这个?

我有一个“更多”标签,我想在当前标签上方处于活动状态(因此,当前标签将在后台可见),但是在此期间应突出显示“更多”标签弹出窗口(如果我激活“更多”选项卡,则TabBar将切换控制器)。弹出窗口消失后,如果未选择任何新标签,我将从后台返回到上一个标签。

我设法使期望的行为没有激活“更多”。每当我触摸该图标时,TabBar就会切换控制器。

2 个答案:

答案 0 :(得分:0)

作为解决方法,您可以通过实现tabBarController(_:shouldSelect:)方法来实现。

这是您应该做的:

第一:在第一个视图控制器中,请确保实现:

tabBarController?.delegate = self

viewDidLoad是合适的地方。

第二:在第一个视图控制器中实现tabBarController(_:shouldSelect:)

func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
    if viewController is PopupViewController {
        // present your pop-up here... for example:
        let alert = UIAlertController(title: "Title", message: nil, preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "OK", style: .destructive, handler: nil))
        present(alert, animated: true)

        return false
    }

    return true
}

在这一点上,点击PopupViewController的项目不会执行任何操作(即使突出显示按钮),但是无论当前哪个视图控制器处于活动状态,它都会显示alert

答案 1 :(得分:0)

您可以继承UITabBarController并重写selectedViewController属性,如下所示:

class CustomTabBarController: UITabBarController {

    override var selectedViewController: UIViewController? {
        get {
            return super.selectedViewController
        }
        set {
            if newValue != viewControllers?.last {
                super.selectedViewController = newValue
            }
        }
    }

    override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
        if let tabBarItemIndex = tabBar.items?.firstIndex(of: item) {
            print("did select tab bar item at index \(tabBarItemIndex)")
        }
    }

}