下面的代码隐藏并显示了导航栏。它在第一个视图加载时被隐藏,然后在“子”被调用时被隐藏。问题是,当他们回到根视图....时,我找不到触发它再次隐藏的事件/动作
我在根页面上有一个“测试”按钮,手动执行操作,但它并不漂亮,我希望它是自动的。
-(void)hideBar
{
self.navController.navigationBarHidden = YES;
}
-(void)showBar
{
self.navController.navigationBarHidden = NO;
}
当前接受的答案与问题中描述的预期行为不匹配。问题要求导航栏隐藏在根视图控制器上,但在其他任何地方都可见,但接受的答案隐藏了特定视图控制器上的导航栏。当第一个视图控制器的另一个实例被推入堆栈时会发生什么?它会隐藏导航栏,即使我们没有在看根视图控制器。
相反,@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];
}
}
我发现的最好的解决方案是在第一个视图控制器中执行以下操作。
objective - c
- (void)viewWillAppear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:YES animated:animated];
[super viewWillAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:NO animated:animated];
[super viewWillDisappear:animated];
}
斯威夫特
override func viewWillAppear(_ animated: Bool) {
self.navigationController?.setNavigationBarHidden(true, animated: animated)
super.viewWillAppear(animated)
}
override func viewWillDisappear(_ animated: Bool) {
self.navigationController?.setNavigationBarHidden(false, animated: animated)
super.viewWillDisappear(animated)
}
这将导致当你在堆栈上推下一个UIViewController时,导航栏从左边(连同下一个视图)动画,当你按下UINavigationBar上的后退按钮时,导航栏动画移到左边(连同旧的视图)。
请注意这些不是委托方法,你重写了UIViewController对这些方法的实现,根据文档,你必须在你的实现中调用super的实现。
通过在你的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];
}
当前接受的答案与问题中描述的预期行为不匹配。问题要求导航栏隐藏在根视图控制器上,但在其他任何地方都可见,但接受的答案隐藏了特定视图控制器上的导航栏。当第一个视图控制器的另一个实例被推入堆栈时会发生什么?它会隐藏导航栏,即使我们没有在看根视图控制器。
相反,@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];
}
}