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

ylo*_*esy 33 xcode ios

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

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

我用谷歌搜索并找到类似的情况并显示相同的错误:

[self.viewController presentViewController:vc animated:NO completion:^{
        [self.viewController dismissViewControllerAnimated:NO completion:nil];
}];
Run Code Online (Sandbox Code Playgroud)

它使用Xcode5和iOS7工作正常.错误意味着什么?iOS8对"Hack"不满意吗?提前致谢.

oli*_*ier 36

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

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

  • 您可以简单地在主队列上调度而不会出现零延迟. (2认同)

Gab*_*ele 7

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

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

- presentViewController:animated:completion: 
Run Code Online (Sandbox Code Playgroud)

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

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

- transitionCoordinator 
Run Code Online (Sandbox Code Playgroud)

transitionCoordinator使您有机会在转换完成后立即将完成块排入队列.

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

调用之后

- presentViewController:animated:completion: 
Run Code Online (Sandbox Code Playgroud)

过渡协调器由框架正确配置.

使用

- animateAlongsideTransition:completion: 
Run Code Online (Sandbox Code Playgroud)

在它上面发送适当的完成块.

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

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];
}
Run Code Online (Sandbox Code Playgroud)


ylo*_*esy 1

我的解决方案:

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

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