Since I\'m using iOS 13, each of my UIAlertController shows up for about half a second and disappears instantly before any user action. Any idea ?
As I use
I've got exactly the same problem, and fixed it by holding the window in which the alert is being presented in a strong variable.
You can hold a window for presenting alerts in you AppDelegate, for example, and use it in your UIAlertController extension.
//In app delegate
let alertWindow: UIWindow = {
let win = UIWindow(frame: UIScreen.main.bounds)
win.windowLevel = UIWindow.Level.alert + 1
return win
}()
Then, in your extension:
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)
}
}
You will also need to make sure your alert window is removed from view when your alert is dismissed, otherwise your app will become unresponsive, as all taps will be handled by the (invisible) alert window, that's still on top of everything. I do this by adding this code to the handlers of all actions in the alert:
(UIApplication.shared.delegate as! AppDelegate).alertWindow.isHidden = true