我最近不得不解决这个问题,我发现有必要在setNavigationBarHidden:NO
之后pushViewController:
和setNavigationBarHidden:YES
之后立即popViewController:
调用,每次调用都带有动画 YES 。
所以,推的时候:
[nc pushViewController:classBView animated:YES]
[nc setNavigationBarHidden:NO animated:YES]
并且在弹出时:
[nc popViewControllerAnimated:YES]
[nc setNavigationBarHidden:YES animated:YES]
但就我而言,虽然我可以按上述方式进行推送,但我不想改变我的B 类,而是希望它不知道导航栏以前没有隐藏(因为它不是我的代码)。此外,该视图使用普通的后退按钮弹出,没有明确调用popViewControllerAnimated:
. 在我的代码中最有效的是让我的类 A成为UINavigationController
委托,并在弹出发生时隐藏委托方法调用上的工具栏。
不幸的是,我发现这些UINavigationControllerDelegate
方法并没有太大帮助,并且在推送我的willShowViewController
B类视图或从它推送的另一个视图弹回该视图时didShowViewController
无法区分。
我遵循了https://stackoverflow.com/questions/642312/中关于覆盖的建议,UINavigationController
并制作了一些自定义委托方法,其中一个在[super popViewControllerAnimated:]
. 我的子类可在https://gist.github.com/jpmhouston/6118713获得,委托方法是:
- (void)navigationController:(UINavigationController *)navigationController isPoppingViewController:(UIViewController *)poppedViewController backTo:(UIViewController *)revealedViewController {
if (revealedViewController == self && [poppedViewController isKindOfClass:[MyClassB class]]) {
[navigationController setNavigationBarHidden:YES animated:YES];
// ...and more code to run only when going from class B back to class A
}
}
我确信在setNavigationBarHidden:
按下后退按钮后有更简单的方法可以调用,但这对我有用。