当我的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>演示或解雇正在进行中!
以下是我尝试过的:
- 我在
dismissViewControllerAnimated
之前放了一个人工延迟,让Dropbox模式关闭,但这没有帮助:[NSThread sleepForTimeInterval:2.0];
- 我试过关闭动画:
[self dismissViewControllerAnimated:NO completion:nil];
,但这也无济于事 - 我已经尝试过检查已经在进行的模式解雇:
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];