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 等等。

问题:

  1. 一旦 VC2VC1 被推送两次,TabBar 总是被隐藏。
  2. 当您点击后退按钮从 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
}

架构更简单

不要将逻辑放在viewWillDisappearprepareForSegue中,因为您不知道即将呈现的视图控制器想要什么样的行为。将逻辑放在 viewWillAppear 中。

让每个 ViewController 处理自己想要的行为,不要试图预测目的地想要什么。特别是因为您并不总是知道 viewWillDisappearprepareForSegue 的原因是什么 - 因此您无法做出相应的反应。