Каждый UIAlertController автоматически исчезает, прежде чем пользователь ответит - начиная с iOS 13 - PullRequest
1 голос
/ 27 сентября 2019

Поскольку я использую iOS 13, каждый из моих UIAlertController появляется примерно на полсекунды и мгновенно исчезает перед любым действием пользователя.Любая идея?

Поскольку я использую UIAlertController из разных частей моего приложения, я использую расширение, которое позволяет мне всплывать как из классических представлений, так и из collectionView (ячейка, заголовок и т. Д.)

public extension UIAlertController {
    func show() {
        let win = UIWindow(frame: UIScreen.main.bounds)
        let vc = UIViewController()
        vc.view.backgroundColor = .clear
        vc.view.tintColor = Theme.mainAccentColor
        win.rootViewController = vc
        win.windowLevel = UIWindow.Level.alert + 1
        win.makeKeyAndVisible()
        vc.present(self, animated: true, completion: nil)
    }
}

А вот пример использования этого расширения:

fileprivate func showMissingAlert() {
        let alert = UIAlertController(title: "blablabla", message: "blablablablabla blabla", preferredStyle: UIAlertController.Style.alert)
        alert.show()
        alert.view.tintColor = Theme.mainAccentColor
        let cancelAction = UIAlertAction(title: "OK, blabla", style: .default, handler: {(alert: UIAlertAction!) in print("ok, leave")})
        alert.addAction(cancelAction)
    }

И далее в моем коде:

showMissingAlert()

До iOS 13 каждый UIAlert работал нормально ... Так какЯ перешел на iOS 13, и даже iOS 13.1, это стало большим беспорядком ...: (*

  • Есть идеи о том, что может вызвать это?

  • А как запретить использование UIAlert в качестве подсознательного сообщения :)?

1 Ответ

1 голос
/ 27 сентября 2019

У меня точно такая же проблема, и я исправил ее, удерживая окно, в котором оповещение представлено в сильной переменной.

Вы можете удерживать окно для представления оповещений в вашем AppDelegate, дляНапример, и используйте его в своем расширении UIAlertController.

//In app delegate
let alertWindow: UIWindow = {
    let win = UIWindow(frame: UIScreen.main.bounds)
    win.windowLevel = UIWindow.Level.alert + 1
    return win
}()

Затем в своем расширении:

public extension UIAlertController {
    func show() {
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let vc = UIViewController()
        vc.view.backgroundColor = .clear
        vc.view.tintColor = Theme.mainAccentColor
        appDelegate.alertWindow.rootViewController = vc
        appDelegate.alertWindow.makeKeyAndVisible()
        vc.present(self, animated: true, completion: nil)
    }
}

Вам также необходимо убедиться, что окно оповещения удалено изпросмотрите, когда ваше оповещение будет отклонено, в противном случае ваше приложение перестанет отвечать на запросы, так как все касания будут обрабатываться (невидимым) окном оповещения, которое по-прежнему находится поверх всего.Я делаю это, добавляя этот код в обработчики всех действий в предупреждении:

(UIApplication.shared.delegate as! AppDelegate).alertWindow.isHidden = true
...