下面的代码隐藏并显示了导航栏。它在第一个视图加载时被隐藏,然后在“子”被调用时被隐藏。问题是,当他们回到根视图....时,我找不到触发它再次隐藏的事件/动作

我在根页面上有一个“测试”按钮,手动执行操作,但它并不漂亮,我希望它是自动的。

-(void)hideBar 
{
    self.navController.navigationBarHidden = YES;
}
-(void)showBar 
{       
    self.navController.navigationBarHidden = NO;
}

当前回答

通过在你的ViewController中实现这个代码,你可以得到这个效果 实际上窍门是,当控制器被启动时隐藏navigationBar

- (void)viewWillAppear:(BOOL)animated {
    [self.navigationController setNavigationBarHidden:YES animated:YES];
    [super viewWillAppear:animated];
}

并在用户离开该页面时取消隐藏导航栏,这是viewWillDisappear

- (void)viewWillDisappear:(BOOL)animated {
    [self.navigationController setNavigationBarHidden:NO animated:YES];
    [super viewWillDisappear:animated];
}

其他回答

我将把代码放在viewWillAppear委托中显示每个视图:

就像你需要隐藏它的地方:

- (void)viewWillAppear:(BOOL)animated
{
        [yourObject hideBar];
}

就像这样,你需要展示它:

- (void)viewWillAppear:(BOOL)animated
{
        [yourObject showBar];
}

最简单的实现可能是让每个视图控制器在viewWillAppear:animated:方法中指定它的导航栏是否隐藏。同样的方法也适用于隐藏/显示工具栏:

- (void)viewWillAppear:(BOOL)animated {
    [self.navigationController setToolbarHidden:YES/NO animated:animated];
    [super viewWillAppear:animated];
}

如果有人仍然对@fabb在接受的答案中评论的快速反滑取消错误有问题。

我设法通过覆盖viewDidLayoutSubviews来修复这个问题,除了viewWillAppear/viewWillDisappear,如下所示:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.setNavigationBarHidden(false, animated: animated)
}

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    self.navigationController?.setNavigationBarHidden(true, animated: animated)
}

//*** This is required to fix navigation bar forever disappear on fast backswipe bug.
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.navigationController?.setNavigationBarHidden(false, animated: false)
}

在我的例子中,我注意到这是因为根视图控制器(其中nav是隐藏的)和被推的视图控制器(nav是显示的)有不同的状态栏风格(例如暗和亮)。当你开始向后滑动以弹出视图控制器时,会有额外的状态栏颜色动画。如果你为了取消交互式弹出而松开手指,而状态栏动画还没有完成,导航栏就永远消失了!

但是,如果两个视图控制器的状态栏样式相同,则不会出现此错误。

只在第一页隐藏导航栏也可以通过故事板实现。在故事板上,进入导航控制器场景->导航栏。从属性检查器中选择“Hidden”属性。这将从第一个视图控制器开始隐藏导航条,直到所需的视图控制器可见为止。

导航栏可以在ViewController的ViewWillAppear回调中设置为可见。

-(void)viewWillAppear:(BOOL)animated {

    [self.navigationController setNavigationBarHidden:YES animated:animated];
    [super viewWillAppear:animated];                                                  
}

当前接受的答案与问题中描述的预期行为不匹配。问题要求导航栏隐藏在根视图控制器上,但在其他任何地方都可见,但接受的答案隐藏了特定视图控制器上的导航栏。当第一个视图控制器的另一个实例被推入堆栈时会发生什么?它会隐藏导航栏,即使我们没有在看根视图控制器。

相反,@Chad M。的策略使用UINavigationControllerDelegate是一个很好的策略,这里有一个更完整的解决方案。步骤:

子类UINavigationController 实现-navigationController:willShowViewController:animated方法,根据导航栏是否显示根视图控制器来显示或隐藏导航栏 重写初始化方法,将UINavigationController子类设置为自己的委托

这个解决方案的完整代码可以在Gist中找到。这是navigationController:willShowViewController:animated实现:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    /* Hide navigation bar if root controller */
    if ([viewController isEqual:[self.viewControllers firstObject]]) {
        [self setNavigationBarHidden:YES animated:animated];
    } else {
        [self setNavigationBarHidden:NO animated:animated];
    }
}