Ios 按下按钮时,当UIAlertController被解除时收到通知

Ios 按下按钮时,当UIAlertController被解除时收到通知,ios,uiviewcontroller,uialertcontroller,Ios,Uiviewcontroller,Uialertcontroller,我想在任何UIAlertController由于用户点击某个警报按钮而自动关闭(动画完成)之前和之后做一些操作并展示一些UI 我如何得到通知,用户按下了我的UIAlertController中的某个按钮,它将被解除,然后被解除 在文档中,建议不要将UIAlertController子类化。我仍然尝试过我的运气子类化,认为它可能在内部调用func dismise(动画标志:Bool,completion:(()->Void)?=nil)。类似于self.dismission(…),但在iOS10上

我想在任何UIAlertController由于用户点击某个警报按钮而自动关闭(动画完成)之前和之后做一些操作并展示一些UI

我如何得到通知,用户按下了我的UIAlertController中的某个按钮,它将被解除,然后被解除

在文档中,建议不要将UIAlertController子类化。我仍然尝试过我的运气子类化,认为它可能在内部调用
func dismise(动画标志:Bool,completion:(()->Void)?=nil)
。类似于
self.dismission(…
),但在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")
}
然后您可以这样使用它:

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")
}
输出顺序如下:

  • 当前完成
  • 将消失
  • 做过 消失
  • 用户点击是

  • 为什么不在“defaultAction”中完成所有需要的操作block?此block警报将被解除。@biloshkurskyi.ss正如我在问题中所写的那样-它容易出错,人们很容易忘记某个地方的block。谢谢。这似乎有效。我希望苹果不会在内部实现中更改任何内容。是否有任何方法获得UIAlertAction或
    中按钮的索引将消失ear
    ??