警告含义:“演示正在进行中!”

50

在我将Instagram集成到我的项目中时,我从UIImagePickerController获取了一张image,然后希望将其发送到Instagram。但是,当我使用UIDocumentInteractionController委托方法presentOptionsMenuFromRect:inView:animated:像这样将image发送到Instagram时,出现了问题。

[documentInteractionController presentOptionsMenuFromRect:CGRectZero inView:self.view animated:YES];

警告信息为 Warning: Attempt to present <_UIDocumentActivityViewController: 0x7584780> on while a presentation is in progress!
应用程序并未崩溃,但我不明白问题所在。为什么会出现这个警告,它是什么意思。我在互联网上搜索了相关问题,但没有找到答案。请帮帮我!!


1
简而言之:您正在打开下一个视图在上一个视图的关闭动画期间。这个令人恼火的问题很简单。只需使用约翰下面的代码,绝对确保关闭动画完成后再开始下一个动画。 - Fattie
8个回答

148
// Breaks
[viewController1 dismissViewControllerAnimated:YES completion:NULL];
[self presentViewController:viewController2 animated:YES completion:NULL];

// Does not break
[viewController1 dismissViewControllerAnimated:YES completion:^{
    [self presentViewController:viewController2 animated:YES completion:NULL];
}];

上述代码的 Swift 3 版本如下:

// Breaks
viewController1.dismiss(animated: true)
present(viewController2, animated: true)

// Does not break
viewController1.dismiss(animated: true) {
    present(viewController2, animated: true)
}
请注意上面第二个示例中完成处理程序的使用。 只有在完全解除viewController1后,它才会呈现viewController2

请问您能提供Swift 3版本吗? - Ne AS

7

如果需要或想要 Swift 3 版本,这里提供了相应的版本。

viewController1.dismiss(animated: true, completion: {
    self.present(self.viewController1, animated: true)
})

viewController1是您想要展示的视图控制器。


3
这意味着您正在呈现或解除显示UIImagePickerController并试图呈现UIDocumentInteractionController,而第一个呈现或解除显示尚未完成。

你能告诉我这个问题的正确解决方案吗?我只能在UIImagepicker的委托方法didFinishPickingImage中调用present UIDocumentInteractionController。 - chakshu
是的,你应该在didFinishPickingImage方法中展示它。在UIImagePicker被dismiss之后。 - Timur Mustafaev

2

尝试...

    double delayInSeconds = 1.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

        [self performSegueWithIdentifier:@"Identifier" sender:self];

    });

2
我收到了这条消息,是因为我复制粘贴了一个已经附加了发送事件的按钮,并且继续创建了另一个连接,因为新按钮应该打开新视图。
所以从技术上讲,我试图同时打开两个视图。

2
这意味着您同时展示了2个视图控制器。请在第一个展示完成后调用您的代理。

2
如果您将一个UIButton连接到IBAction来呈现一个ViewController,并在Storyboard中从按钮创建一个segue到目标ViewController,也会发生这种情况。当我移动一些交互时,忘记删除UIButton的IBAction连接时就会出现这种情况。删除IBAction连接或segue之一即可解决问题。

1
正如之前所说,这意味着你试图同时展示两个模态窗口或弹出框。但在我的情况下,当我收到此消息时,我没有见到任何模态窗口或弹出框。
造成错误的原因是:当我第一次调用弹出框时,有另一个错误阻止了弹出框的显示,但它仍然处于“已呈现”状态。所有随后尝试显示弹出框的尝试都失败,并出现运行时错误“正在进行演示时!”。
因此,如果你遇到了同样的情况,请查看日志,并尝试找到以*** WebKit discarded an uncaught exception in the...开头的第一个错误。
希望它能节省有人的时间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接