NSInvalidArgumentException:不支持多次推送同一个视图控制器实例

NSInvalidArgumentException :Pushing the same view controller instance more than once is not supported

应用程序崩溃并出现此错误

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];
}

如果有人可以帮助解决这个错误

错误消息准确地告诉您问题出在哪里:您正试图推送一个已经在堆栈中的视图控制器实例。

换句话说,segue.destinationViewController 已经 被推送,因此它要么是当前视图控制器的父级之一,要么是当前控制器本身。

真正的原因在没有看到您的代码的情况下无法确定。您可能遇到与 this question 类似的问题,因为运行时允许事件发生两次。同样有可能与 segue 相关的事情被关闭了。

作为第一步,我建议向 segue 添加日志语句(不是断点,因为它们会改变可观察到的行为)以查看它是否被多次调用(因此类似于链接问题)。

好吧,这就是我如何检查我的视图控制器是否在导航堆栈上的方法 但这实际上解决了我的问题

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");

  }

对于你的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"]){

 }

}

在我的情况下,第一次推送不够快,所以我 运行 遇到了同样的问题。修复是检查情况:

if (targetViewController == self.navigationController?.topViewController) {
  NSLog("ignore double")
} else {
  self.navigationController!.pushViewController(targetViewController, animated: true)
}