Ios 返回ViewController时未设置hidesBottomBarWhenPushed

Ios 返回ViewController时未设置hidesBottomBarWhenPushed,ios,uiviewcontroller,uinavigationcontroller,Ios,Uiviewcontroller,Uinavigationcontroller,我为推送到UINavigationController堆栈上的其中一个UIViewController(称为ViewControllerA)设置了hidesBottomBarWhenPushed=true。当我将新的ViewController推到ViewControllerA的顶部时,我也选择显示底部栏。因此,我有: class ViewControllerA: UIViewController { override func viewWillDisappear(animated: Bool

我为推送到UINavigationController堆栈上的其中一个UIViewController(称为ViewControllerA)设置了hidesBottomBarWhenPushed=true。当我将新的ViewController推到ViewControllerA的顶部时,我也选择显示底部栏。因此,我有:

class ViewControllerA: UIViewController {

override func viewWillDisappear(animated: Bool) {
    self.hidesBottomBarWhenPushed = false
}

override func viewWillAppear(animated: Bool) {
    self.hidesBottomBarWhenPushed = true
}
这一切都很好

当我按下ViewControllerA时,底部栏隐藏。 当我按下任何其他ViewController时,底部栏显示

但是,当我在导航堆栈中向后移动时(即点击UIBarButtonItemBack按钮),当我弹出导航堆栈以显示ViewControllerA时,无法隐藏底部栏


我错过了什么?谢谢

我相信此属性的预期用途是在按下时隐藏条。因此,当视图控制器在最上面的一个弹出后出现时,它没有被推到堆栈上,因此它不会更改选项卡栏的外观

这给您留下了两个选择:

1) 保留所有视图控制器的底部栏。输入文本时,键盘会覆盖底部栏


2) 隐藏视图控制器A的底部栏,以及推到A顶部的任何其他视图控制器。

明白了!以下是有效的方法:

class ViewControllerCustom: UIViewController {
  init() {
    self.hidesBottomBarWhenPushed = true
  }

  override func viewDidAppear(animated: Bool) {
    self.hidesBottomBarWhenPushed = false
  }
}
然后在每个UIViewController的自定义BarButtonItemBack实现中,我检查上一个视图控制器(将弹出到)是否需要隐藏选项卡栏。当然,我把它抽象成了一个通用函数,所以我不需要重复代码,但概念是这样的。谢谢你帮我解决这个问题

func barButtonItemBackPressed(button: UIButton) {

  var viewControllers = self.navigationController!.viewControllers as! [UIViewController]
  if ((viewControllers[viewControllers.count - 2]).isKindOfClass(ViewControllerCustom.self)) {
    (viewControllers[viewControllers.count - 2] as! ViewControllerCustom).hidesBottomBarWhenPushed = true
  }

  self.navigationController?.popViewControllerAnimated(true)
}

这个问题的可能重复是指在弹出第二个视图控制器时隐藏选项卡栏,而在按下第二个视图控制器时不再显示它。@标记正确。谢谢。虽然在那篇文章中,他们确实提到了在用户按下“后退”按钮时采取适当的步骤来显示它。请尝试此回答,但是如果此属性用于隐藏特定视图控制器的底部栏,那么当再次显示视图控制器时,它不应该被隐藏吗,aka popped toI我认为其预期用途是在按下视图控制器时隐藏该条,假设没有其他按下的视图控制器需要显示该条。它本质上保证了用户在没有首先弹出到导航控制器的根目录之前不能跳转到其他选项卡。您希望该属性的行为更像一个导航项,每个视图控制器都使用它来自定义导航控制器,而不考虑转换。您的具体用例是什么?例如,以注释视图控制器为例。我们不需要选项卡栏,因为键盘和输入字段位于底部。许多应用程序在有注释视图时会选择隐藏选项卡栏。然而,从评论视图中,您可以向前导航,比如说用户视图。所以现在我的问题是,当用户返回到评论视图时,会显示选项卡栏,它是不正确的。啊,我明白了。我已经用两种最安全的解决方案更新了我的答案。你可以通过点击标签栏获得你期望的行为,但我推荐我的一个答案。不幸的是,你似乎无法在导航控制器中动态地显示和隐藏按钮栏。我会玩一会儿,但是很欣赏你的洞察力。谢谢