当 UIAlertController 在按钮按下时被关闭时收到通知

Posted

技术标签:

【中文标题】当 UIAlertController 在按钮按下时被关闭时收到通知【英文标题】:Get notified when UIAlertController is being dismissed on button press 【发布时间】:2017-08-11 16:44:46 【问题描述】:

我想在任何 UIAlertController 由于用户点击警报按钮之一而自行关闭(动画完成)之前和之后立即执行一些操作并呈现一些 UI。

如何在用户按下我的 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 处理程序中也会有点麻烦。

我会很感激任何想法。

【问题讨论】:

为什么你不在“defaultAction”块中做所有需要的事情?无论如何,此阻止警报将被解除。 @biloshkurskyi.ss 正如我在我的问题中所写的那样 - 它容易出错,很容易忘记某处的块。 【参考方案1】:

虽然不建议进行子类化,但您可以使用这样的简单子类:

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")

输出顺序如下:

    现在完成 将消失 做了 消失 用户点击是。

【讨论】:

谢谢。这似乎有效。我希望 Apple 不会在内部实施中做出任何改变。 有什么方法可以获取willDisappear中的UIAlertAction或者按钮的索引??【参考方案2】:

您可以像这样完全禁用关闭动画:

class InstantCloseAlertController: UIAlertController 
    
    override func viewWillDisappear(_ animated: Bool) 
        super.viewWillDisappear(animated)
        UIView.setAnimationsEnabled(false)
    
    
    override func viewDidDisappear(_ animated: Bool) 
        super.viewDidDisappear(animated)
        UIView.setAnimationsEnabled(true)
    

这将立即触发动作处理程序。

但我目前也在研究您所要求的内容(保留动画)。我把一切都整理好了,但需要更多的工作。它涉及很多黑客行为,哈哈。完成后我会发布。

【讨论】:

以上是关于当 UIAlertController 在按钮按下时被关闭时收到通知的主要内容,如果未能解决你的问题,请参考以下文章

显示没有按钮的 UIAlertController 时 UI 测试失败

不要关闭 UIAlertController

将 UITextField(来自 UIAlertController)插入 NSMutableArray

UIAlertController:在 UIAlertAction 上推送视图控制器(点击“确定”按钮)

iOS UI 测试:如何获取 UIAlertController 的消息

UITableView 中的 UIAlertController 返回 nil