【问题标题】:iOS 7 error Warning: Attempt to dismiss from view controller <UINavigationController: 0x1568db40> while a presentation or dismiss is in progressiOS 7 错误警告:尝试从视图控制器中关闭 <UINavigationController: 0x1568db40> 在演示或关闭过程中
【发布时间】:2013-09-19 17:15:39
【问题描述】:

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

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

QuickSchedule[880:60b] 警告:尝试从视图中关闭 演示文稿时的控制器 或正在解雇!

我正在使用 unwind 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 。无论如何,错误一直出现。

就功能而言,一切正常,我只是将此错误记录到控制台。非常感谢任何帮助。

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

【问题讨论】:

  • 你是从按钮触发的展开segue,还是直​​接连接到视图控制器?
  • 它连接到我的 AdEmployeeViewController 上的 UIBarButtonItems Done 和 Cancel,以及返回到 ScheduleViewController 的视图控制器上的 UIBarButtonItem Done。

标签: iphone ios uiviewcontroller ios7


【解决方案1】:

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

【讨论】:

  • 这真的很有帮助。我不知道 unwind segue 为我处理了这个问题。
  • 我遇到了同样的问题。我在 iOS 6 期间对故事板的理解来自 developer.apple.com/legacy/library/documentation/iPhone/… 的“你的第二个 iOS 应用程序:故事板”@ 在该教程(自 iOS 7 起标记为“不推荐”)中,所有展开都包含了 dismissViewControllerAnimated:completion: 。
  • @ErikAllen,我不确定那个教程是怎么回事,因为你通常不会调用dismissViewControllerAnimated:completion: 在你要返回的控制器中——就像你不会' t 调用 presentViewController:animated:completion 进行前向 segue。
  • 其实这个答案并不总是正确的。当您从 UISplitViewController(Master 或 Detail)呈现模态视图控制器时,展开续集不会为您执行解除操作,因此您必须在您的展开操作方法中调用 dismissViewControllerAnimated。但是,即使那样,如果您在 unwind 操作方法中确实有该调用,则在装有 iOS 7 的 iPhone 上运行时仍然会收到错误。我尝试将调用包装在 if 检查中:if !segue.sourceViewController.isBeingDismissed () {...},但 isBeingDismissed() 在 iOS 7 (iPhone) 上总是返回 false。 Clustermuck。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 好的,我做到了,你是对的,错误消失了。但是现在 ViewController 消失了,而且看起来不太对劲。 ScheduleViewController.m 中的代码是我唯一看到调用该特定动画的地方。 EmployeeViewController 中的相同内容。我真的希望视图控制器在完成后向下滑动。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-28
        • 2015-05-19
        • 1970-01-01
        • 1970-01-01
        • 2013-03-30
        • 2017-01-15
        • 1970-01-01
        相关资源
        最近更新 更多