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)
}
应用程序崩溃并出现此错误
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)
}