试图解除视图控制器时发出警告(模态中的模态)



当我的iOS应用程序第一次启动时,我会自动打开一个"欢迎"模式,如下所示:

UIViewController *intro = [self.storyboard instantiateViewControllerWithIdentifier:@"intro"];
intro.modalPresentationStyle = UIModalPresentationFullScreen;
//Show the modal
[self presentViewController:intro animated:NO completion:nil];

在该模式中,用户被指示将应用程序链接到Dropbox。他们点击一个按钮就会触发:

[[DBSession sharedSession] linkFromController:self];

这是一个Dropbox SDK方法,它在另一个模式中打开Dropbox身份验证UIWebView,如下所示:http://d.pr/i/6ZnC

一旦他们登录,模态会自动为关闭设置动画。

然后我试着用这个来关闭最初的介绍模式:

[self dismissViewControllerAnimated:YES completion:nil];

但我收到了这个警告,模态没有关闭:

警告:试图从视图控制器中解除<PPIntroViewController:0xf296ab0>演示或解雇正在进行中!

以下是我尝试过的:

  1. 我在dismissViewControllerAnimated之前放了一个人工延迟,让Dropbox模式关闭,但这没有帮助:[NSThread sleepForTimeInterval:2.0];
  2. 我试过关闭动画:[self dismissViewControllerAnimated:NO completion:nil];,但这也无济于事
  3. 我已经尝试过检查已经在进行的模式解雇:if(![self isBeingDismissed]){ ... },但没有成功

有什么想法吗?如何确定呈现/驳回和阻止模态关闭的具体内容?

iOS 7+Xcode 5

我发现了这个问题。你可以在DBSession+ios.m中看到这条线

[rootController presentalModalViewController:navController动画:是];

因此,在内部,他们将从self呈现身份验证视图控制器。您已经展示了self中的视图控制器。所以,当他们或您试图将视图控制器从自身中移除时,发出此警告,因为它具有呈现视图控制器。因此,与其将self传递给dropBox,不如传递intro视图控制器。

[[DBSession sharedSession] linkFromController:intro];

尝试调用

[self dismissViewControllerAnimated:YES completion:nil];

从introViewController内部,而不是从根目录中。如果没有其他模态,这应该调用self.presentingViewController。所以我会在第一个的完成句柄块中嵌套一个

我发现,如果您在上一个事务(动画)进行时尝试推送/取消视图控制器,就会出现此问题。

NSTimer并在0.50到1秒之间解除ViewController。这是一个有用的技巧,使您当前的viewController已经完成了它的动画。

否则不确定,但尝试用dismissViewControllerAnimated设置

[self dismissViewControllerAnimated:NO completion:nil];

最新更新