Замена UIAlertView на UIAlertController

Поскольку 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, чтобы получить желаемое поведение?

«При использовании showMessageBox сообщение всплывает как мигание и исчезает, не дожидаясь, пока я нажму кнопку «ОК». Я предполагаю, что это нет поведение по умолчанию, как/куда вы звоните showMessageBox?

Ahmad F 11.02.2019 07:05

Вы отклоняете viewController внутри метода quitViewController()?

M Reza 11.02.2019 07:06

Да, я отклоняю это.

Michel 11.02.2019 08:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
307
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предполагая, что вы отклонение 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 11.02.2019 08:17

да, это решение работает. Что касается вашего комментария о частной собственности, вы можете быть правы, но есть ли у вас лучшее предложение, чтобы получить тот же результат?

Michel 11.02.2019 08:53

@Michel, я бы использовал любой из стилей UIAlertController или UIAlertAction по умолчанию, где я могу контролировать дизайн. И если бы мой клиент заставлял меня показывать оповещения с пользовательскими стилями, я бы показывал, например, всплывающее окно без использования UIAlertController.

OOPer 11.02.2019 08:59

Другие вопросы по теме