ios - dismissViewControllerAnimated :completion: not executed

标签 ios uiviewcontroller

当我调用 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/

相关文章:

iphone - 旋转 iPhone 并改变 View

iOS:之前已经使用过应用程序时跳过 ViewControllers

objective-c - 使用 segues 返回 ViewController

ios - 如何使用 Swift 在 iOS 中同时调用 20 个 Web 服务?

ios - iphone SDWebImage 调整缓存图像的大小

javascript - 检测文件是否应该从 UIWebview 下载

ios - viewDidLoad() 中的 addSubView() 和 BringSubViewToFront() 不起作用

ios - 使 UIContainerView 与设备屏幕一样宽

ios - 将 TableView 中的数据存储到 NSUserDefaults

ios - indexPath.row 总是返回零