如果有人有经验,我可以使用一些帮助来调试这个问题。我有一个 UITabBarController 作为我的根视图控制器。每个选项卡的第一个视图控制器是 UINavigationController。
选项卡 1:带有地图的视图是第一个 viewController。当您按下标注时,将运行以下代码:
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {
[self performSegueWithIdentifier:@"ShowLocationDetails" sender:self];
}
在情节提要中,我将其连接为Push
.
在第一个 viewController 上,因为我有一张地图并且不想显示导航栏,所以我这样做:
FirstViewController <UINavigationControllerDelegate>
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
[self.navigationController setNavigationBarHidden:YES animated:NO];
}
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
[self.navigationController setNavigationBarHidden:YES animated:NO];
}
在我推入堆栈的第二个视图控制器上,我确实想要导航栏,所以我有以下代码:
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
if ([viewController isKindOfClass:[FirstViewController class]]) {
[self.navigationController setNavigationBarHidden:YES animated:YES];
}
else {
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
}
选项卡 2:现在只是一个选项卡视图。
如果我执行这些简单的步骤,我可以让我的应用程序崩溃:
按标注以推送 LocationDetails。按返回返回到第一个视图控制器 按选项卡二转到 TableViewController 按选项卡一返回到地图,这会导致 EXC_BAD_ACCESS 崩溃。我尝试运行 Instruments,但我不知道它是什么意思:
如果我启动应用程序,并且整天在选项卡之间切换而不将新控制器推入选项卡 1 上的堆栈,它不会崩溃。
如果我删除 navigationController willShowViewController 委托方法,它也不会崩溃。但当然,我有导航栏,这不是我想要的。
有什么想法吗?谢谢!
编辑 所以我尝试了Nuzhat所说的,我遇到了同样的问题。我都试过了
self.navigationController.navigationBar.hidden = YES;
和
self.navigationController.navigationBardHidden = YES;
这不是我正在寻找的解决方案。当我推送到下一个视图控制器时,navigationBar 不存在。所以在那个 viewController 的 viewDidLoad 中,我设置
self.navigationController.navigationBar.hidden = NO;
然后我弹回到 FirstViewController,然后我切换选项卡,仍然崩溃。隐藏导航栏似乎有问题,然后再次显示。