dismissViewControllerAnimated:completion:未执行

时间:2013-08-28 13:56:52

标签: ios uiviewcontroller

当我打电话给 dismissViewControllerAnimated:completion: 来解除UIViewController时,如果相应的视图正在动画到屏幕上,则永远不会执行完成块(使用{{ 1}})。

presentViewController:animated:completion:甚至没有消失。就像UIViewController被忽略一样。

以下代码是一个简化的代码示例,因为原始代码要大得多。我在下面给出的代码模拟了一个用例,其中网络通信错误可能触发视图弹出,而另一个视图也同时弹出...

代码示例:

dismissViewControllerAnimated:completion:

日志输出为:

  

2013-08-28 16:14:12.162 [1708:c07]提出观点
  2013-08-28 16:14:12.178 [1708:c07]驳回观点
  2013-08-28 16:14:12.583 [1708:c07]查看完成演示


在这些情况下有谁知道如何解雇NSLog(@"Presenting view"); [self presentViewController:changeLocationViewController animated:YES completion:^{ NSLog(@"View done presenting"); }]; NSLog(@"Dismissing view"); [self dismissViewControllerAnimated:NO completion:^{ NSLog(@"View done dismissing"); }];

提前致谢。

4 个答案:

答案 0 :(得分:5)

此代码段不起作用的原因是因为这些方法中的完成块是在动画完成后的稍后时间执行的。您可以在日志中看到这一点:“解除视图”发生在“查看完成呈现”之前。试试这个:

NSLog(@"Presenting view");

[self presentViewController:changeLocationViewController animated:YES completion:^{
    NSLog(@"View done presenting");
    NSLog(@"Dismissing view");

    [self dismissViewControllerAnimated:NO completion:^{
        NSLog(@"View done dismissing");
    }];
}];

编辑:

如果您需要确保在发生网络错误时取消视图,请尝试设置名为networkErrorFound的布尔实例变量。

完成网络连接后,如果发生错误,请将其设置为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");
        }];
    }
}];

这样,它会一直等到完成解雇。您还需要处理在动画完成后发生错误的情况(例如,最终失败的慢速连接),但这不在此问题的范围内。

答案 1 :(得分:1)

为什么在完成加载后你不解雇它?

[self presentViewController:changeLocationViewController animated:YES completion:^{
    NSLog(@"View done presenting");

    NSLog(@"Dismissing view");

    [self dismissViewControllerAnimated:NO completion:^{
        NSLog(@"View done dismissing");
     }];
}];

答案 2 :(得分:0)

行。您似乎想要呈现VC,但如果找不到网络,请关闭VC。我认为需要这样做的唯一原因是,如果网络仅在您正在呈现的新VC中被检查(并且如果无法连接则想要解除)。

您可以通过实现@aopsfan给出的答案中显示的代码来实现这一目标。

但想想那个UI流程。你告诉一个饥饿的人(用户)他可以吃三明治(他想要看到的下一个VC)......但是等等! (解雇想要的VC)不,你不能拥有三明治(没有网络)!骗了你!。

这样做的方法是保持UI流不错而不是恶化,就是在呈现VC之前检查网络连接。可能会检查用于呈现新VC的IBAction(?)中的网络。这样,您可以在演示前进行检查。而不是现在 - 取消

哎呀,你甚至可以显示正在进行的HUD视图,让用户知道发生了什么!

答案 3 :(得分:-2)

尝试使用UIView animation.like:

包装该函数
    [UIView animateWithDuration:0.f
                     animations:^{
                         [self.presentedViewController dismissViewControllerAnimated:NO completion:^{

                         }];
                     } completion:^(BOOL finished) {

                         [self presentViewController:controller animated:YES completion:nil];
                     }];