iOS 7 错误警告:尝试从视图控制器<UINavigation控制器:0x1568db40>在演示或关闭过程中关闭



我在iOS 7中遇到了问题,但在iOS 6中没有出现。

我有一个导航控制器,它正在显示另一个导航控制器以添加员工。 第二个控制器正在以模式呈现。 当我使用"取消"或"完成"按钮关闭第二个控制器时,出现错误。 这是错误:

快速计划[880:60b] 警告:尝试从视图中关闭 演示时的控制器 或者正在解雇!

我正在使用展开 segue 并使用以下相关代码从第一个控制器中解脱。

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

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

连接检查器中"完成"按钮的连接很简单"行动->[展开完成:]"

在升级到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。如您所见,我在完成块参数的一个位置为 nil,在另一个位置为 NULL。 无论如何,错误不断出现。

就功能而言,一切都有效,我只是将此错误记录到控制台。 任何帮助将不胜感激。

注意:使用常规推送的导航控制器时,我没有收到此错误。 这仅在关闭模态呈现的视图控制器时发生。

我很

惊讶你在以前版本的 Xcode 中不会看到同样的问题,因为我认为你的问题是在"done"方法中调用 dismissViewControllerAnimated:completion:。这在iOS 6中也应该是一个问题。展开 segue 会为您执行解除,因此您不应该自己调用此方法。尝试将其注释掉,看看是否可以解决问题。

我只在iOS 7中遇到了同样的问题。

我的问题是在 viewWillAppear: 方法上调用适用于 UI 的方法(如显示UIAlertView等)。这是非常错误的,因为当一个视图被关闭时,会出现另一个视图,因此两个 UI 方法都被调用。

我已将方法移至viewDidAppear:方法,问题已解决。

重新检查您的代码。在触发另一个动画过渡之前,您的动画尚未完全完成。我遇到了同样的问题,并将其追踪到多个略微重叠的动画。设置dismissViewControllerAnimated:NO,你就会明白我的意思。

这是

这个问题的真正答案..! 大多数时候你的程序员不注意苹果iOS SDK中的事件枚举...如果您在 [UIButton] 上使用这样的事件 [ UIControlEventAllEvent ] 并运行 [dismissViewControllerAnimated] 请注意 [ UIControlEventAllEvent ] 包含许多其他事件,并且在视图完成 [UIControlEventAllEvent ] 枚举类型中的所有其他事件之前,您将关闭视图!!所以如果你只想点击按钮,只需使用[UIControlEventTouchUpInside],它会给你这个错误!!

类型特定于 iOS7 而不是 iOS6 的警告确实会出现在其他情况下。就我而言,这与电子邮件警报的关闭有关。我只需要在下面的方法中添加条件结构 iOS7.

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

最新更新