我是Swift编程的新手,但是找不到解决我问题的答案,那就是...
当我展示一个带有UIAlertAction处理程序的简单UIAlertController时,我希望在用户继续响应之前显示警报,直到用户响应,然后执行该处理程序。
出乎意料的是,它似乎在显示警报和执行处理程序之前完成了代码块。
我已经搜索了Stackoverflow,并重新阅读了Apple开发人员文档中的UIAlertController和UIAlertAction,但是我不明白为什么在用户响应之前代码不会暂停。
我尝试将UIAlertController代码放入其自己的函数中,但是警报似乎仍然显示为乱序。我在想,可能需要延迟一下才能让警报在下一行代码执行之前绘制(?)。
@IBAction func buttonTapped(_ sender: Any) {
let alert = UIAlertController(title: "Ouch", message: "You didn't have to press me so hard!", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Sorry", style: .default, handler: { _ in
self.handleAlert()
}))
self.present(alert, animated: true, completion: nil)
print("Should be printed last!")
}
func handleAlert() {
print("UIAlertAction handler printed me")
}
在上面的代码中,我希望调试控制台显示:
UIAlertAction处理程序打印了我 应该最后打印!
但是它显示:
Should be printed last! UIAlertAction handler printed me
答案 0 :(得分:1)
您可以像这样添加它而不是添加单独的功能吗...
let alert = UIAlertController(title: "Ouch", message: "You didn't have to press me so hard!", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Sorry", style: .default, handler: { action in
// code for action goes here
}))
self.present(alert, animated: true)
答案 1 :(得分:0)
UIAlertController设计为异步运行(这就是为什么它让您传递代码块以在执行操作而不是提供返回值时执行)
因此,要修复您的代码,请在另一个函数中选择一个动作后将要运行的代码放入,然后在每个UIAlertAction处理程序的末尾调用该函数。
private var currentlyShowingAlert = false
@IBAction func buttonTapped(_ sender: Any) {
if currentlyShowingAlert {
return
}
let alert = UIAlertController(title: "Ouch", message: "You didn't have to press me so hard!", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Sorry", style: .default, handler: { _ in
self.handleAlert()
self.alertCleanup()
}))
self.present(alert, animated: true, completion: nil)
currentlyShowingAlert = true
}
func handleAlert() {
print("UIAlertAction handler printed me")
}
func alertCleanup() {
print("Should be printed last!")
currentlyShowingAlert = false
}
在进行操作以直接响应按钮按下时,例如推视图控制器(或调用会堆积的任何事物)时要小心。
当主线程繁忙时,可以在第一次buttonTapped
调用发生之前多次按下按钮,在这种情况下,buttonTapped
可以连续调用多次,currentlyShowingAlert
可以防止问题。