hidesBottomBarWhen在返回ViewController

时间:2015-07-15 02:40:42

标签: ios uiviewcontroller uinavigationcontroller

我将hidesBottomBarWhenPushed = true设置为我的一个UIViewController(称为ViewControllerA),它被推送到我的UINavigationController堆栈。当我在ViewControllerA上推一个新的ViewController时,我也选择显示bottomBar。因此我有:

class ViewControllerA: UIViewController {

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

override func viewWillAppear(animated: Bool) {
    self.hidesBottomBarWhenPushed = true
}

一切正常。

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

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

我错过了什么?谢谢!

2 个答案:

答案 0 :(得分:1)

知道了!这是有效的:

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)
}

答案 1 :(得分:0)

我相信此属性的预期用途是在推送时隐藏栏。因此,当您的视图控制器出现在最顶层的视图控制器弹出后,它不会被推入堆栈,因此它不会更改标签栏的外观。

这为您提供了两个选项:

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

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