Hide/Show TabBar 在 ViewController 循环中
Hide/Show TabBar in ViewController loops
情况:
我在 TabBarController
中嵌入了一些 ViewControllers
(全部带有 NavigationBar
)。我有一个特定的 ViewController
(VC1),我不想在其中显示 TabBar
。从那里您可以转到另一个特定的 ViewController
(VC2),其中 TabBar
需要再次显示。
我的解决方案:
VC1
self.hidesBottomBarWhenPushed
默认设置为 true
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
self.hidesBottomBarWhenPushed = false
}
override func viewWillDisappear(animated: Bool) {
self.hidesBottomBarWhenPushed = true
}
VC2
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
self.hidesBottomBarWhenPushed = true
}
override func viewWillDisappear(animated: Bool) {
self.hidesBottomBarWhenPushed = false
}
到目前为止一切顺利。这似乎可行,但您可以从 VC2(具有不同内容的同一控制器)推送另一个 VC1,当然还可以推送另一个 VC2 来自 VC1 等等。
问题:
- 一旦 VC2 从 VC1 被推送两次,
TabBar
总是被隐藏。
- 当您点击后退按钮从 VC1 返回到 VC2 时,
TabBar
始终隐藏。
尝试根据需要更改 属性 VC:
self.navigationController.toolbarHidden = YES;
在 viewWillApear 中尝试使用这些代码来隐藏或取消隐藏,它会正常工作。
对于 VC1:- 在此您希望始终隐藏然后添加此代码
override func viewWillAppear(animated: Bool) {
self.tabBarController?.tabBar.hidden = true
}
对于 VC2:- 在此您希望始终显示然后添加此代码
override func viewWillAppear(animated: Bool) {
self.tabBarController?.tabBar.hidden = false
}
试试这个代码,它工作正常。我也在示例项目中尝试了这段代码。
仅自定义 VC1
override func viewWillAppear(animated: Bool) {
self.tabBarController?.tabBar.hidden = true
}
override func viewWillDisappear(animated: Bool) {
self.tabBarController?.tabBar.hidden = false
}
架构更简单
不要将逻辑放在viewWillDisappear
或prepareForSegue
中,因为您不知道即将呈现的视图控制器想要什么样的行为。将逻辑放在 viewWillAppear
中。
让每个 ViewController 处理自己想要的行为,不要试图预测目的地想要什么。特别是因为您并不总是知道 viewWillDisappear
或 prepareForSegue
的原因是什么 - 因此您无法做出相应的反应。
情况:
我在 TabBarController
中嵌入了一些 ViewControllers
(全部带有 NavigationBar
)。我有一个特定的 ViewController
(VC1),我不想在其中显示 TabBar
。从那里您可以转到另一个特定的 ViewController
(VC2),其中 TabBar
需要再次显示。
我的解决方案:
VC1
self.hidesBottomBarWhenPushed
默认设置为 true
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
self.hidesBottomBarWhenPushed = false
}
override func viewWillDisappear(animated: Bool) {
self.hidesBottomBarWhenPushed = true
}
VC2
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
self.hidesBottomBarWhenPushed = true
}
override func viewWillDisappear(animated: Bool) {
self.hidesBottomBarWhenPushed = false
}
到目前为止一切顺利。这似乎可行,但您可以从 VC2(具有不同内容的同一控制器)推送另一个 VC1,当然还可以推送另一个 VC2 来自 VC1 等等。
问题:
- 一旦 VC2 从 VC1 被推送两次,
TabBar
总是被隐藏。 - 当您点击后退按钮从 VC1 返回到 VC2 时,
TabBar
始终隐藏。
尝试根据需要更改 属性 VC:
self.navigationController.toolbarHidden = YES;
在 viewWillApear 中尝试使用这些代码来隐藏或取消隐藏,它会正常工作。
对于 VC1:- 在此您希望始终隐藏然后添加此代码
override func viewWillAppear(animated: Bool) {
self.tabBarController?.tabBar.hidden = true
}
对于 VC2:- 在此您希望始终显示然后添加此代码
override func viewWillAppear(animated: Bool) {
self.tabBarController?.tabBar.hidden = false
}
仅自定义 VC1
override func viewWillAppear(animated: Bool) {
self.tabBarController?.tabBar.hidden = true
}
override func viewWillDisappear(animated: Bool) {
self.tabBarController?.tabBar.hidden = false
}
架构更简单
不要将逻辑放在viewWillDisappear
或prepareForSegue
中,因为您不知道即将呈现的视图控制器想要什么样的行为。将逻辑放在 viewWillAppear
中。
让每个 ViewController 处理自己想要的行为,不要试图预测目的地想要什么。特别是因为您并不总是知道 viewWillDisappear
或 prepareForSegue
的原因是什么 - 因此您无法做出相应的反应。