2017-08-11 100 views
0

我想要做一些操作并在任何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处理程序中也会有点麻烦。

我会很感激任何想法。

+0

为什么你不在“defaultAction”块内做所有需要的东西?无论如何,此阻止警报将被解除。 –

+0

@ biloshkurskyi.ss正如我在我的问题中写的 - 这很容易出错,人们可能很容易在某处忘记一个块。 – iur

回答

0

虽然子类不建议你可以使用一个简单的子类,像这样:

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

输出是按以下顺序:

  1. 目前完成
  2. 将会消失
  3. 确实 消失
  4. 用户点击是。
+0

谢谢。这似乎工作。我希望苹果公司在内部实施中不会改变任何事情。 – iur