尝试在转换时关闭演示控制器

时间:2014-09-10 09:57:52

标签: ios xcode

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

  

"尝试在转换过程中关闭演示控制器。   如果没有设置transitionViewForCurrentTransition,演示文稿控制器在演示期间被解雇了? "

我用谷歌搜索并找到了类似的案例并显示了同样的错误:

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

使用Xcode5和iOS7可以正常工作。错误意味着什么? iOS8对于" Hack"是不是很满意?提前谢谢。

4 个答案:

答案 0 :(得分:36)

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

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

答案 1 :(得分:6)

我遇到了同样的问题,我找到了一个干净的解决方案,避免使用dispatch_async或dispatch_after。

简单地说,如异常所述,您正在尝试在呈现转换仍在进行时关闭视图控制器。 这意味着一旦

- presentViewController:animated:completion: 
调用

完成块,并调用dismiss,转换未完成。

从iOS 7开始过渡UIViewController有一个新方法

- transitionCoordinator 

transitionCoordinator为您提供 转换完成后立即将完成块排入队列的机会。

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

调用

之后
- presentViewController:animated:completion: 

框架正确配置了转换协调器。

使用

- animateAlongsideTransition:completion: 

发送正确的完成块。

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

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];
}

答案 2 :(得分:1)

我的解决方案:

  

dismissViewControllerAnimated:completion :如果您连续呈现多个视图控制器,从而构建一堆呈现的视图控制器,则在堆栈中较低的视图控制器上调用此方法会解除其直接子视图控制器和所有查看控制器上方的子控制器。发生这种情况时,只有最顶层的视图以动画方式被删除;任何中间视图控制器都可以从堆栈中删除。

例如,我有4个视图:A-&gt; B-&gt; C-&gt; D当我想要关闭B时,我首先检查C是否也想通过使用objc_setAssociatedObject来附加/分离NSString来解除对象,如果C也想解雇,那么只需取消C的请求。只需要调用B即可。

答案 3 :(得分:-2)

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