hidesBottomBarWhenPushed = NO不工作?

rot*_*ice 26 iphone objective-c uitabbarcontroller uitabbar

我有一个UITabBar在我的应用程序中,我UIViewController通过将此行放在A ppDelegate中而隐藏在第一个选项卡中的第一个:

// ... in MyAppDelegate.m
firstViewController.hidesBottomBarWhenPushed = YES;
Run Code Online (Sandbox Code Playgroud)

firstViewController,用户可以推送一个在同一个选项卡UIButton中推送新内容UIViewController.UITabBar当发生这种情况时,我希望能再次看到它.我试图让它像这样回来:

//... in firstViewController.m

secondViewController = [[SecondViewController alloc] init];
secondViewController.hidesBottomBarWhenPushed = NO;
[[self navigationController] pushViewController:secondViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)

不幸的是,没有带回来UITabBar.它仍然是隐藏的.

UITabBar隐藏后如何正确地带吧?

提前致谢.

Loz*_*Loz 70

这个问题已经困扰了我一段时间,我只是找到了一个有效的解决方案.这个hidesBottomBarWhenPushed属性是一个非常奇怪的野兽,在我看来,这是一种反直觉的方式.

它的问题是当你按下一个新的视图控制器(或弹回)时,navigationController将询问所有视图控制器(从上到下)是否要隐藏底栏,如果他们中的任何一个说YEStabbar将是隐藏,这就是为什么tabbar保持隐藏,尽管设置NO隐藏在新的视图控制器上.

这是我的解决方案 - hidesBottomBarWhenPushed在视图控制器中覆盖您希望没有标签栏的getter,并检查它是否位于堆栈的顶部:

Objective-C的

- (BOOL) hidesBottomBarWhenPushed
{
    return (self.navigationController.topViewController == self);
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特(不那么明显,因此片段)

override var hidesBottomBarWhenPushed: Bool {
    get {
        return navigationController?.topViewController == self
    }
    set {
        super.hidesBottomBarWhenPushed = newValue
    }
}
Run Code Online (Sandbox Code Playgroud)

这很好地将hide/show逻辑封装在一个地方,所以你不必在隐藏的viewcontroller之外考虑它.

  • 非常感谢,你让我很开心,这让我发疯:)这是迟钝的,它应该以这种方式开箱即用,至少这是我猜每个人都期望的行为。 (2认同)
  • 这太棒了,而且很容易。我认为苹果应该添加此行为作为一个选项。 (2认同)

Cha*_*zak 28

这就是文档hidesBottomBarWhenPushed所说的内容(重点补充):

如果是,则底部栏保持隐藏状态,直到视图控制器从堆栈弹出.

因此,您所看到的行为看起来就像文档所说的那样.首先将视图控制器推到具有的堆栈上hidesBottomBarWhenPushed = YES.此时,将其他视图控制器推入堆栈将不会更改底栏的隐藏性.只要第一个视图控制器在堆栈上,底栏就会保持隐藏状态.

因此,我认为您必须采用不同的方式来实现您的UI目标.一种选择是在标签栏控制器的视图上将第一个视图控制器显示为模态视图控制器.然后,当你想要转到第二个视图控制器时,只需关闭第一个视图控制器即可.唯一的视觉差异将是过渡动画.

肯定还有其他选择,但这只是我想到的第一个.

祝好运!


CFI*_*Fok 11

我有同样的问题,但3小时后我找到了解决方案!在2010年10月8日回答的这个主题中,Dave Batton说:

正确使用hidesBottomBarWhenPushed属性的方法是:

self.anotherViewController.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:self.anotherViewController animated:animated];
Run Code Online (Sandbox Code Playgroud)