自iOS 13起,每个UIAlertController都会在用户响应之前自动消失

Cre*_*omy 7 swift uialertcontroller ios13

由于我使用的是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)
    }
}
Run Code Online (Sandbox Code Playgroud)

这是此扩展名用法的示例:

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)
    }
Run Code Online (Sandbox Code Playgroud)

进一步在我的代码中:

showMissingAlert()
Run Code Online (Sandbox Code Playgroud)

在iOS 13之前,每个UIAlert都可以正常工作...自从我转移到iOS 13甚至iOS 13.1以来,情况就变得一团糟... :(

  • 关于什么可能导致此的任何想法?

  • 以及如何防止将UIAlert用作潜意识消息:)?

pep*_*psy 8

我遇到了完全相同的问题,并通过将在其中以强变量呈现警报的窗口修复了该问题。

例如,您可以在AppDelegate中保留一个用于显示警报的窗口,并在UIAlertController扩展中使用它。

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

然后,在您的扩展程序中:

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

您还需要确保在关闭警报时将警报窗口从视图中删除,否则您的应用将变得无响应,因为所有轻按都将由(不可见的)警报窗口处理,这仍然是所有问题的重中之重。为此,我将以下代码添加到警报中所有操作的处理程序中:

(UIApplication.shared.delegate as! AppDelegate).alertWindow.isHidden = true
Run Code Online (Sandbox Code Playgroud)

  • @user_Dennis_Mostajo 你确定你在安全的地方持有对警报窗口的强引用吗?在您发布的链接中,您在“showAlertGlobally”函数中创建它。 (2认同)