试图在已经转换的时候closures演示控制器

我使用iOS8 GM上的Xcode6 GM编译我的项目。 closures许多视图控制器时,我的应用程序总是崩溃,debugging区域显示:

“试图在已经转换的时候closures表示控制器,transitionViewForCurrentTransition没有设置,表示控制器在演示过程中被解散了吗?

我GOOGLE了,find一个类似的情况,并显示相同的错误:

[self.viewController presentViewController:vc animated:NO completion:^{ [self.viewController dismissViewControllerAnimated:NO completion:nil]; }]; 

它使用Xcode5和iOS7工作正常。 错误是什么意思? iOS8对“Hack”不满意吗? 提前致谢。

你是否试图强制改变设备方向? 无论如何,在我看来,你可以尝试改变你的当前代码:

 [self.navigationController presentViewController:vc animated:NO completion:^{ dispatch_after(0, dispatch_get_main_queue(), ^{ [self.navigationController dismissViewControllerAnimated:NO completion:nil]; }); }]; 

我有同样的问题,我发现一个干净的解决scheme避免使用dispatch_async或dispatch_after。

简单地说,正如exception所描述的那样,当呈现转换仍在进行中时,您试图closures视图控制器。 这意味着一旦

 - presentViewController:animated:completion: 

完成块被调用,并且你调用closures,过渡没有完成。

从iOS 7开始转换UIViewController有一个新的方法可用

 - transitionCoordinator 

transitionCoordinator让您有机会在转换完成后立即排队完成块。

该方法返回的对象符合UIViewControllerTransitionCoordinator协议。 知道解决scheme非常简单。

在调用之后

 - presentViewController:animated:completion: 

过渡协调器由框架正确configuration。

使用

 - animateAlongsideTransition:completion: 

在其上发送适当的完成块。

这里有一个更好地解释解决scheme的代码片段

 void(^completion)() = ^() { [modalViewController dismissViewControllerAnimated:YES completion:nil]; }; // This check is needed if you need to support iOS version older than 7.0 BOOL canUseTransitionCoordinator = [viewController respondsToSelector:@selector(transitionCoordinator)]; if (animated && canUseTransitionCoordinator) { [viewController presentViewController:modalViewController animated:animated completion:nil]; [viewController.transitionCoordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> context) { completion(); }]; } else { [viewController presentViewController:modalViewController animated:animated completion:completion]; } 

我的解决scheme

dismissViewControllerAnimated:completion :如果您连续呈现几个视图控制器,从而构build呈现的视图控制器堆栈,则在堆栈中较低视图控制器上调用此方法将取消其立即子视图控制器以及堆栈上的该子视图之上的所有视图控制器。 当发生这种情况时,只有最顶层的观点才会以animation的方式被驳回。 任何中间视图控制器都可以简单地从堆栈中移除。

例如,我有4个视图:A-> B-> C-> D,当我想解雇B时,首先检查C是否也想通过使用objc_setAssociatedObject附加/分离NSString对象来解雇,如果C想也解雇了,那就取消C的要求。

 ThirdViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"Third"]; UIViewController *VC1 = self.presentingViewController; [self dismissViewControllerAnimated:NO completion:^{}]; [VC1 presentViewController:vc animated:YES completion:^{}];