首页 文章

当UIAlertController在按下按钮时被解雇时收到通知

提问于
浏览
1

由于用户点击其中一个警报按钮,我想在任何UIAlertController解散自己(动画完成)之前和之后立即执行一些操作并提供一些UI .

如何通知用户在我的UIAlertController中按下某个按钮,它将被解雇然后被解雇?

在docs中,建议不要继承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处理程序中也会有点麻烦 .

我很感激任何想法 .

1 回答

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

    输出按以下顺序排列:

    • presentCompletion

    • 将消失

    • 确实消失了

    • 用户点击是 .

相关问题