【问题标题】:hidesBottomBarWhenPushed not set when returning back to ViewController返回 ViewController 时未设置 hidesBottomBarWhenPushed
【发布时间】:2015-10-03 21:57:38
【问题描述】:

我为我的 UIViewController 之一(称为 ViewControllerA)设置了 hidesBottomBarWhenPushed = true,该 UIViewController 被推送到我的 UINavigationController 堆栈中。当我将新的 ViewController 推到 ViewControllerA 上时,我还选择显示 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。

我错过了什么?谢谢!

【问题讨论】:

  • 这个问题是指第二个视图控制器弹出时隐藏标签栏,第二个视图控制器被推送时不再显示。
  • @Mark 正确。谢谢。
  • 虽然在那篇文章中看起来他们确实提到了在用户按下后退按钮时采取适当的步骤来显示它。

标签: ios uiviewcontroller uinavigationcontroller


【解决方案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)
}

【讨论】:

    【解决方案2】:

    我相信此属性的预期用途是在按下时隐藏栏。因此,当您的视图控制器在弹出最顶部的视图控制器后出现时,它并没有被推送到堆栈上,因此它不会改变标签栏的外观。

    这让您有两个选择:

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

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

    【讨论】:

    • 但是如果这个属性是为了隐藏特定视图控制器的底栏,那么当视图控制器再次出现时,它是否应该被隐藏,也就是弹出到
    • 我认为预期用途是在推送视图控制器时隐藏栏,假设没有其他推送的视图控制器需要显示的栏。它本质上保证了用户在没有首先弹出到导航控制器的根目录的情况下不能跳转到不同的选项卡。您期望该属性的行为更像一个导航项,每个视图控制器都使用它来自定义导航控制器,而不管转换如何。您的具体用例是什么?
    • 以评论视图控制器为例。我们不需要标签栏,因为键盘和输入字段位于底部。许多应用程序在有评论视图时选择隐藏标签栏。然而,从评论视图中,您可以向前导航以说出类似于用户视图的内容。所以现在我的问题是,当用户返回评论视图时,会显示标签栏并且不正确。
    • 啊,我明白了。我已经用最安全的两种解决方案更新了我的答案。您可以通过破解标签栏来获得您期望的行为,但我推荐我的答案之一。不幸的是,您似乎无法在导航控制器内的推送和弹出操作中动态显示和隐藏标签栏。
    • 我明白了。我会玩一下它,但感谢你的洞察力。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    相关资源
    最近更新 更多