iOS 7错误警告:试图从视图控制器<UINavigationController:0x1568db40>解雇正在演示或解雇

我有问题在iOS 7中不出现在iOS 6中。

我有一个导航控制器显示另一个导航控制器来添加一个员工。 这第二个控制器正在模态地呈现。 当我用“取消”或“完成”button解除第二个控制器时,出现错误。 这是错误:

QuickSchedule [880:60b]警告:正在进行演示或解散时尝试从视图控制器中解散!

我正在使用下面的相关代码来解除第一个控制器的退休时间。

这是在ScheduleViewController.m(我的主控制器窗口)

- (IBAction)done:(UIStoryboardSegue *)segue { if ([[segue identifier] isEqualToString:@"DoneEditing"]) { [[MyManager sharedManager] saveChanges]; [self dismissViewControllerAnimated:YES completion:NULL]; } } 

连接检查器中的“完成”button的连接只是“动作 – > [放松完成:]”

在升级到Xcode 5之前,我没有任何错误。这一切都是在将Xcode和我的故事板升级到iOS 7之后开始的。

我在我的应用程序在不同的地方得到同样的错误,但它又是一个模态的视图控制器。

我从EmployeeViewController模块去AddEmployeeViewController。 当我从AddEmployeeViewController返回时,我再次得到错误。

EmployeeViewController.m

 - (IBAction)done:(UIStoryboardSegue *)segue { if ([[segue identifier] isEqualToString:@"ReturnInput"]) { AddEmployeeViewController *addController = [segue sourceViewController]; if (addController.employee) { [[MyManager sharedManager] saveChanges]; [[self tableView] reloadData]; } if (![self.presentedViewController isBeingDismissed]) { [self dismissViewControllerAnimated:YES completion:nil]; } } } - (IBAction)cancel:(UIStoryboardSegue *)segue { if ([[segue identifier] isEqualToString:@"CancelInput"]) { [self dismissViewControllerAnimated:YES completion:NULL]; } } 

这里是AddEmployeeViewController.m

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@"ReturnInput"]) { if ([self.firstNameField.text length] || [self.lastNameField.text length]) { Employee *newEmployee = [[MyManager sharedManager] createEmployeeWithFirstName:self.firstNameField.text andLastName:self.lastNameField.text]; [[MyManager sharedManager] addEmployeeToList:newEmployee]; self.employee = newEmployee; } } } 

我还在学习,我已经在网上找了几个小时,找不到答案。 我已经尝试把“保存代码”放在一个完成块中。 我把它放回去,尝试在完成块参数中使用nil而不是NULL。 正如你所看到的,我有一个完成块参数的零点,另一个是NULL。 无论如何,错误不断出现。

一切都起作用,我只是把这个错误logging到控制台。 任何帮助是极大的赞赏。

注意:我没有得到这个常规推送导航控制器的错误。 这只是在解散模态显示的视图控制器上发生。

我很惊讶,你不会看到以前版本的Xcode的同样的问题,因为我认为你的问题是调用dismissViewControllerAnimated:完成:在“完成”的方法。 这在iOS 6中也应该是一个问题。 放松继续为你解雇,所以你不应该自己调用这个方法。 尝试评论一下,看看是否解决了这个问题。

我只有iOS 7也有同样的问题。

我的问题是调用在UI上工作的方法(如显示UIAlertView等) viewWillAppear:方法。 这是非常错误的,因为当一个观点被驳回时 ,另一个观点正在出现,所以两个UI方法都被调用。

我已经将我的方法移至viewDidAppear:方法,问题已经修复。

重新检查你的代码。 你有一个animation,还没有完全完成之前,发射另一个animation过渡。 我有同样的问题,并追踪到多个animation略有重叠。 设置dismissViewControllerAnimated:NO ,你会明白我的意思。

这里是这个问题的真正答案..! 大多数时间你程序员不注意在苹果iOS SDK的事件枚举…如果你在[UIButton]上使用这样的事件[UIControlEventAllEvent],并运行[dismissViewControllerAnimated]注意到[UIControlEventAllEvent]包含很多其他事件,并且在完成[UIControlEventAllEvent]的枚举types内的所有其他事件之前,您正在closures视图! 所以如果你只是想点击button只是使用[UIControlEventTouchUpInside],它会给你这个错误!

在其他情况下,特定于iOS7而不是iOS6的这种types的警告。 在我的情况下,这是关于解雇电子邮件警报。 我只需要在下面的方法中用iOS7添加条件结构。

 - (void)didPresentAlertView:(UIAlertView *)alertView { if(![[self modalViewController] isBeingDismissed]) { [self dismissModalViewControllerAnimated:YES]; } }