我遇到了完全相同的问题,并通过将警报显示在一个强变量中的窗口中进行修复。
例如,您可以在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