应用程序因此错误而崩溃
NSInvalidArgumentException :Pushing the same view controller instance more than once is not supported
尝试从另一个导航控制器的UIBarButtonItem推送另一个导航控制器时出现此错误。
消息显示在控制台中:
UINavigationController pushViewController:transition:forceImmediate:]_block_invoke + 0
这是segue编码
else if ([segue.identifier isEqualToString:@"showGroupView"]) {
GroupView *groupView = (GroupView *)segue.destinationViewController;
[self.navigationController pushViewController:groupView animated:YES];
}
如果有人可以帮助解决此错误
答案 0 :(得分:2)
错误消息确切地告诉您问题所在:您正在尝试推送已经在堆栈上的视图控制器实例。
换句话说,segue.destinationViewController
已经已经推送,因此它是当前视图控制器的父节点之一,或者是当前控制器本身。
如果没有看到您的代码,就无法确定实际的原因。你有可能遇到与this question类似的问题,因为运行时允许事件发生两次。与segue有关的事情同样可能会消失。
作为第一步,我建议将日志语句添加到segue(不是断点,因为它们会改变可观察行为),以便查看它是否被多次调用(因此类似于链接的问题) )。
答案 1 :(得分:1)
这就是我如何检查我的视图控制器是否在导航堆栈上 但这实际上解决了我的问题
if ([[self.navigationController topViewController] isKindOfClass:[groupView class]]){
self.navigationController.navigationBarHidden = YES;
}else{
self.navigationController.navigationBarHidden = NO;
}
所以整个代码都适用于任何人参考
else if ([segue.identifier isEqualToString:@"showGroupView"]) {
GroupView *groupView = (GroupView *)segue.destinationViewController;
if ([[self.navigationController topViewController] isKindOfClass:[groupView class]]){
self.navigationController.navigationBarHidden = YES;
}else{
self.navigationController.navigationBarHidden = NO;
}
NSLog(@"showGroupViewsegued");
}
答案 2 :(得分:0)
对于你的suitison,你应该删除“[self.navigationController pushViewController:groupView animated:YES];”,它将跳转到特定segue.destionViewController的storyBpard。
我自己测试一下。
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// 只作为传值使用 不用再进行导航控制器的 跳转操作
//无需导航即可推送或显示
if ([segue.destinationViewController isKindOfClass:[AddCategory class]]) {
AddCategory *controller = (AddCategory *)segue.destinationViewController;
controller.categoryText = sender;
}
if ([segue.identifier isEqualToString:@"AddCategory"]) {
//进入到下一步骤 :只作为传值使用
//specilized
}else if ([segue.identifier isEqualToString:@"AddCategory2"]){
}
}
答案 3 :(得分:0)
在我的情况下,第一次推送不够快,所以我遇到了同样的问题。修复是检查情况:
if (targetViewController == self.navigationController?.topViewController) {
NSLog("ignore double")
} else {
self.navigationController!.pushViewController(targetViewController, animated: true)
}