当我调用 dismissViewControllerAnimated:completion:
关闭 UIViewController
时,当相应的 View 位于在屏幕上显示动画(使用 presentViewController:animated:completion:
)。
UIViewController
甚至没有消失。这就像 dismissViewControllerAnimated:completion:
被忽略了。
以下代码是一个简化的代码示例,因为原始代码要大得多。我在下面给出的代码模拟了一个用例,其中网络通信错误可能会触发一个 View 弹出,而另一个 View 也同时弹出。
代码示例:
NSLog(@"Presenting view");
[self presentViewController:changeLocationViewController animated:YES completion:^{
NSLog(@"View done presenting");
}];
NSLog(@"Dismissing view");
[self dismissViewControllerAnimated:NO completion:^{
NSLog(@"View done dismissing");
}];
日志输出为:
2013-08-28 16:14:12.162 [1708:c07] Presenting view
2013-08-28 16:14:12.178 [1708:c07] Dismissing view
2013-08-28 16:14:12.583 [1708:c07] View done presenting
有谁知道如何在这些情况下关闭 UIViewController
?
提前致谢。
最佳答案
此代码片段不起作用的原因是这些方法中的完成 block 是在动画完成后的稍后时间执行的。您可以在日志中看到这一点:“关闭 View ”发生在“ View 完成呈现”之前。试试这个:
NSLog(@"Presenting view");
[self presentViewController:changeLocationViewController animated:YES completion:^{
NSLog(@"View done presenting");
NSLog(@"Dismissing view");
[self dismissViewControllerAnimated:NO completion:^{
NSLog(@"View done dismissing");
}];
}];
编辑:
如果您需要确保在发生网络错误时关闭 View ,请尝试设置一个名为 networkErrorFound
的 bool 实例变量。
完成网络连接后,如果发生错误,请将此设置为YES
。然后使用这段代码:
[self presentViewController:changeLocationViewController animated:YES completion:^{
NSLog(@"View done presenting");
NSLog(@"Dismissing view");
if (self.networkErrorFound) {
[self dismissViewControllerAnimated:NO completion:^{
NSLog(@"View done dismissing");
}];
}
}];
这样一来,它会等到呈现完成后才关闭。您还需要处理动画完成后发生错误的情况(例如,最终失败的缓慢连接),但这超出了这个问题的范围。
关于ios - dismissViewControllerAnimated :completion: not executed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18490036/