用 UIAlertController 替换 UIAlertView
Replacing UIAlertView by UIAlertController
由于 UIAlertView
已弃用,我想在我的旧库中将其替换为 UIAlertController
。
但这样做并不总是显而易见的。例如,我有这两个功能,执行非常相似的任务。
showAlertViewMessageBox 使用 UIAlertView
而 showMessageBox 使用 UIAlertController
:
func showAlertViewMessageBox(_ msg:String, title:String, caller:UIViewController) {
let userPopUp = UIAlertView()
userPopUp.delegate = caller
userPopUp.title = title
userPopUp.message = msg
userPopUp.addButton(withTitle: "OK")
userPopUp.show()
}
func showMessageBox(_ msg:String, title:String, caller:UIViewController) {
let attribMsg = NSAttributedString(string: msg,
attributes: [NSAttributedString.Key.font:UIFont.systemFont(ofSize: 23.0)])
let userPopUp = UIAlertController(title:title,
message:nil, preferredStyle:UIAlertController.Style.alert)
userPopUp.setValue(attribMsg, forKey: "attributedMessage")
let alertAction = UIAlertAction(title:"OK", style:UIAlertAction.Style.default,
handler:{action in})
alertAction.setValue(UIColor.darkGray, forKey: "titleTextColor")
userPopUp.addAction(alertAction)
caller.present(userPopUp, animated: true, completion: nil)
}
我想尽量使用showMessageBox。但是我有这种不开心的情况:
在下面的代码中:
//showMessageBox(usrMsg, title: popTitle, caller: self)
showAlertViewMessageBox(usrMsg, title: popTitle, caller: self)
quitViewController()
使用 showAlertViewMessageBox 时,消息会弹出并停留在那里,直到我单击“确定”按钮。
(这是我想要的行为)
当使用 showMessageBox 时,消息会以闪烁的形式弹出并消失,而无需等待我单击确定按钮。
(这不是我想要的行为)
我应该如何修改 showMessageBox 以获得我想要的行为?
假设您在 quitViewController() 方法中关闭 viewController,很自然地 消息将以闪烁的形式弹出,不等我点击确定按钮就消失了。由于您的 quitViewController()
方法无需等待单击“确定”按钮即可执行。
一种方法是添加一个参数来处理“确定”按钮的点击:
func showMessageBox(_ msg:String, title:String, caller:UIViewController, onOk: @escaping ()->Void) {
let attribMsg = NSAttributedString(string: msg,
attributes: [NSAttributedString.Key.font:UIFont.systemFont(ofSize: 23.0)])
let userPopUp = UIAlertController(title:title,
message:nil, preferredStyle:UIAlertController.Style.alert)
userPopUp.setValue(attribMsg, forKey: "attributedMessage")
let alertAction = UIAlertAction(title:"OK", style:UIAlertAction.Style.default,
handler:{action in onOk()}) //<- Call the Ok handler
alertAction.setValue(UIColor.darkGray, forKey: "titleTextColor")
userPopUp.addAction(alertAction)
caller.present(userPopUp, animated: true, completion: nil)
}
用作:
showMessageBox(usrMsg, title: popTitle, caller: self) {
self.quitViewController()
}
顺便说一下,UIAlertController
的 attributedMessage
和 UIAlertAction
的 titleTextColor
是私有属性,因此使用此代码可能会导致您的应用因使用私有属性而被拒绝API。
由于 UIAlertView
已弃用,我想在我的旧库中将其替换为 UIAlertController
。
但这样做并不总是显而易见的。例如,我有这两个功能,执行非常相似的任务。
showAlertViewMessageBox 使用 UIAlertView
而 showMessageBox 使用 UIAlertController
:
func showAlertViewMessageBox(_ msg:String, title:String, caller:UIViewController) {
let userPopUp = UIAlertView()
userPopUp.delegate = caller
userPopUp.title = title
userPopUp.message = msg
userPopUp.addButton(withTitle: "OK")
userPopUp.show()
}
func showMessageBox(_ msg:String, title:String, caller:UIViewController) {
let attribMsg = NSAttributedString(string: msg,
attributes: [NSAttributedString.Key.font:UIFont.systemFont(ofSize: 23.0)])
let userPopUp = UIAlertController(title:title,
message:nil, preferredStyle:UIAlertController.Style.alert)
userPopUp.setValue(attribMsg, forKey: "attributedMessage")
let alertAction = UIAlertAction(title:"OK", style:UIAlertAction.Style.default,
handler:{action in})
alertAction.setValue(UIColor.darkGray, forKey: "titleTextColor")
userPopUp.addAction(alertAction)
caller.present(userPopUp, animated: true, completion: nil)
}
我想尽量使用showMessageBox。但是我有这种不开心的情况:
在下面的代码中:
//showMessageBox(usrMsg, title: popTitle, caller: self)
showAlertViewMessageBox(usrMsg, title: popTitle, caller: self)
quitViewController()
使用 showAlertViewMessageBox 时,消息会弹出并停留在那里,直到我单击“确定”按钮。 (这是我想要的行为)
当使用 showMessageBox 时,消息会以闪烁的形式弹出并消失,而无需等待我单击确定按钮。 (这不是我想要的行为)
我应该如何修改 showMessageBox 以获得我想要的行为?
假设您在 quitViewController() 方法中关闭 viewController,很自然地 消息将以闪烁的形式弹出,不等我点击确定按钮就消失了。由于您的 quitViewController()
方法无需等待单击“确定”按钮即可执行。
一种方法是添加一个参数来处理“确定”按钮的点击:
func showMessageBox(_ msg:String, title:String, caller:UIViewController, onOk: @escaping ()->Void) {
let attribMsg = NSAttributedString(string: msg,
attributes: [NSAttributedString.Key.font:UIFont.systemFont(ofSize: 23.0)])
let userPopUp = UIAlertController(title:title,
message:nil, preferredStyle:UIAlertController.Style.alert)
userPopUp.setValue(attribMsg, forKey: "attributedMessage")
let alertAction = UIAlertAction(title:"OK", style:UIAlertAction.Style.default,
handler:{action in onOk()}) //<- Call the Ok handler
alertAction.setValue(UIColor.darkGray, forKey: "titleTextColor")
userPopUp.addAction(alertAction)
caller.present(userPopUp, animated: true, completion: nil)
}
用作:
showMessageBox(usrMsg, title: popTitle, caller: self) {
self.quitViewController()
}
顺便说一下,UIAlertController
的 attributedMessage
和 UIAlertAction
的 titleTextColor
是私有属性,因此使用此代码可能会导致您的应用因使用私有属性而被拒绝API。