如何隐藏导航控制器堆栈中单个视图控制器的选项卡栏

时间:2018-02-02 22:18:03

标签: ios swift uiviewcontroller uinavigationcontroller uitabbarcontroller

我有UITabBarController。其中一个标签包含UINavigationController

我想将视图控制器推到导航堆栈上并隐藏该视图控制器上的标签栏。我可以通过以下方式轻松完成:

toVC.tabBarController?.hidesBottomBarWhenPushed = true
self.navigationController?.pushViewController(toVC, animated: true)

或在故事板中进行:

hidesBottomBarWhenPushed

问题是,这会隐藏我推入堆栈的任何后续视图控制器的标签栏。我想简单地隐藏这个视图控制器的标签栏,并在它之前和之后为所有其他视图控制器显示它。

3 个答案:

答案 0 :(得分:1)

有一种解决方法。它的工作方式与下面的gif一样。

the gif

对于推入UIViewController堆栈的每个UINavigationControlleroverride hidesBottomBarWhenPushed这个属性:

override var hidesBottomBarWhenPushed: Bool {
    get {
        switch navigationController?.topViewController {
        case .some(let controller):
            switch controller == self {
            case true:
                return super.hidesBottomBarWhenPushed
            case false:
                return false
            }
        default:
            return super.hidesBottomBarWhenPushed
        }
    }
    set {
        super.hidesBottomBarWhenPushed = newValue
    }
}

第一个switch检查此控制器是否属于某个UINavigationController堆栈。第二个开关检查UIViewController堆栈的当前顶部UINavigationController是否为self

希望它适用于您的情况。快乐的编码(^

答案 1 :(得分:0)

如果您隐藏在故事板上,则通过此属性,您的标签栏将隐藏所有视图控制器。所以你可以通过代码管理它。

您可以通过在ViewDidLoad()或ViewWillAppear()方法中编写一行代码来以编程方式执行此操作

对于Swift 3: -

self.tabBarController?.tabBar.isHidden = true

如果要取消隐藏标签栏,只需在ViewDidLoad()或ViewWillAppear()方法中编写以下代码

self.tabBarController?.tabBar.isHidden = false

答案 2 :(得分:0)

在要隐藏标签栏的视图控制器中尝试此操作:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.tabBarController?.tabBar.isHidden = true
}

这在视图控制器之前和之后要隐藏标签栏的位置:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.tabBarController?.tabBar.isHidden = false
}

修改

完全实施的例子:

class ViewController1: UIViewController {
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.tabBarController?.tabBar.isHidden = false
    }
}

class ViewController2: UIViewController {
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.tabBarController?.tabBar.isHidden = true
    }
}

class ViewController3: UIViewController {
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.tabBarController?.tabBar.isHidden = false
    }
}

enter image description here