我有UITabBarController
。其中一个标签包含UINavigationController
。
我想将视图控制器推到导航堆栈上并隐藏该视图控制器上的标签栏。我可以通过以下方式轻松完成:
toVC.tabBarController?.hidesBottomBarWhenPushed = true
self.navigationController?.pushViewController(toVC, animated: true)
或在故事板中进行:
问题是,这会隐藏我推入堆栈的任何后续视图控制器的标签栏。我想简单地隐藏这个视图控制器的标签栏,并在它之前和之后为所有其他视图控制器显示它。
答案 0 :(得分:1)
有一种解决方法。它的工作方式与下面的gif一样。
对于推入UIViewController
堆栈的每个UINavigationController
我override
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
}
}