Поскольку UIAlertView устарел, я хочу заменить его на UIAlertController в своих старых библиотеках.
Но это не всегда очевидно сделать. Например, у меня есть эти две функции, выполняющие очень похожую задачу.
показатьалертвиевмессажебокс использует 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 сообщение всплывает и остается там, пока я не нажму кнопку OK. (Это поведение, которое я хочу)
При использовании showMessageBox сообщение всплывает как мигание и исчезает, не дожидаясь, пока я нажму кнопку OK. (Это НЕ то поведение, которое я хочу)
Как мне изменить showMessageBox, чтобы получить желаемое поведение?
Вы отклоняете viewController внутри метода quitViewController()?
Да, я отклоняю это.





Предполагая, что вы отклонение viewController внутри метода quitViewController(), вполне естественно, что сообщение появится как мигание и исчезнет, не дожидаясь, пока я нажму кнопку ОК. Поскольку ваш метод quitViewController() выполняется без ожидания нажатия кнопки OK.
Одним из способов является добавление параметра для обработки нажатия кнопки OK:
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()
}
Кстати, attributedMessage из UIAlertController и titleTextColor из UIAlertAction являются частными свойствами, поэтому использование этого кода может привести к тому, что ваше приложение будет отклонено из-за использования частных API.
В ПОРЯДКЕ. Я постараюсь. Я понимаю аргумент, но моя функция showAlertViewMessageBox работает так, как я хочу.
да, это решение работает. Что касается вашего комментария о частной собственности, вы можете быть правы, но есть ли у вас лучшее предложение, чтобы получить тот же результат?
@Michel, я бы использовал любой из стилей UIAlertController или UIAlertAction по умолчанию, где я могу контролировать дизайн. И если бы мой клиент заставлял меня показывать оповещения с пользовательскими стилями, я бы показывал, например, всплывающее окно без использования UIAlertController.
«При использовании showMessageBox сообщение всплывает как мигание и исчезает, не дожидаясь, пока я нажму кнопку «ОК». Я предполагаю, что это нет поведение по умолчанию, как/куда вы звоните
showMessageBox?