用 UIAlertController 替换 UIAlertView

Replacing UIAlertView by UIAlertController

由于 UIAlertView 已弃用,我想在我的旧库中将其替换为 UIAlertController。 但这样做并不总是显而易见的。例如,我有这两个功能,执行非常相似的任务。

showAlertViewMessageBox 使用 UIAlertViewshowMessageBox 使用 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()
    }

顺便说一下,UIAlertControllerattributedMessageUIAlertActiontitleTextColor 是私有属性,因此使用此代码可能会导致您的应用因使用私有属性而被拒绝API。