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

时间:2015-01-16 21:50:18

标签: ios uinavigationcontroller uistoryboardsegue

应用程序因此错误而崩溃

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

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

4 个答案:

答案 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)
}