由于我使用的是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用作潜意识消息:)?
我遇到了完全相同的问题,并通过将警报显示在一个强变量中的窗口中进行修复。
例如,您可以在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