为什么过早地解雇UIAlertController并不会忽略警报

时间:2017-12-13 20:31:22

标签: ios

我刚刚意识到过早地在警报控制器上调用解雇会导致他们不被解雇。例如,如果我出现警报控制器,然后立即尝试将其解除,则忽略该解除。例如

// Done in viewDidLoad
let alertController = UIAlertController(title: nil, message: "Connecting to Bubble Centerpiece...\n\n", preferredStyle: .alert)
present(alertController, animated: true, completion: nil)
alertController.dismiss(animated: true, completion: nil)

使用此代码,AlertController不会被解雇。在我的情况下,我的被解雇通常在警报控制器出现后大约0.5秒内被调用,并且没有被解雇。我必须手动延迟这样的解散代码才能使其正常工作。

DispatchQueue.main.asyncAfter(deadline: .now() + 1.0, execute: { self.alertController.dismiss(animated: true, completion: nil)})

我的假设是警报控制器需要一些时间才能正确设置,如果解雇呼叫的到达时间早于实际显示的警报,那么它将不会被解雇。我想知道是否有一个更优雅的解决方案,而不是用DispatchQueue延迟它。

1 个答案:

答案 0 :(得分:3)

因为,只要您通过animated: true,警报控制器就不会在层次结构中进行动画处理,因此在此之前您无法解除警报。这正是completion块的用法(通常,任何好的API,其中发生的事情异步将为您提供一个完成块,让您知道该操作何时完成)。您可以通过以下方式立即解雇(尽管我不会想象这是一个有价值的真实用例):

present(alertController, animated: true, completion: { 
    alertController.dismiss(animated: true, completion: nil)
})