当UIAlertController在按下按钮时被取消通知
问题描述:
我想要做一些操作并在任何UIAlertController因为用户点击其中一个警报按钮而退出之前和之后呈现一些UI(动画完成)。当UIAlertController在按下按钮时被取消通知
我如何得到通知用户在我的UIAlertController中按下了一些按钮,它将被解雇然后被解雇?
在文档中,建议不要继承UIAlertController的子类。我仍然尝试过我的运气子类化,认为它本身可能在内部调用func dismiss(animated flag: Bool, completion: (() -> Void)? = nil)
。类似于self.dismiss(...
,但在iOS10上似乎不是这种情况。
我也尝试添加“手动”驳回到UIAlertAction处理程序:
let alert = UIAlertController.init(...
let defaultAction = UIAlertAction(title: "OK", style: .default, handler: { action in
alert.dismiss(animated: true, completion: {
print("Dismissed")
})
})
alert.addAction(defaultAction)
但似乎警报按钮按下之后,但在调用处理程序之前被解雇。无论如何,它不工作。即使它有效,记住将代码添加到每个UIAlertAction处理程序中也会有点麻烦。
我会很感激任何想法。
答
虽然子类不建议你可以使用一个简单的子类,像这样:
class CustomAlertController: UIAlertController {
var willDisappearBlock: ((UIAlertController) -> Void)?
var didDisappearBlock: ((UIAlertController) -> Void)?
override func viewWillDisappear(_ animated: Bool) {
willDisappearBlock?(self)
super.viewWillDisappear(animated)
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
didDisappearBlock?(self)
}
}
然后你可以使用它像这样:
let alert = CustomAlertController(title: "Alert", message: "This is an alert. Press Yes or No.", preferredStyle: .alert)
alert.willDisappearBlock = { alert in
print("\(alert) will disappear")
}
alert.didDisappearBlock = { alert in
print("\(alert) did disappear")
}
alert.addAction(UIAlertAction(title: "Yes", style: .default, handler: { (yesAction) in
print("User tapped Yes.")
}))
alert.addAction(UIAlertAction(title: "No", style: .cancel, handler: { (yesAction) in
print("User tapped No.")
}))
present(alert, animated: true) {
print("presentCompletion")
}
输出是按以下顺序:
- 目前完成
- 将会消失
- 确实 消失
- 用户点击是。
+0
谢谢。这似乎工作。我希望苹果公司在内部实施中不会改变任何事情。 – iur
为什么你不在“defaultAction”块内做所有需要的东西?无论如何,此阻止警报将被解除。 –
@ biloshkurskyi.ss正如我在我的问题中写的 - 这很容易出错,人们可能很容易在某处忘记一个块。 – iur