Я пытаюсь представить viewcontroller на topMostViewController, он работает в iOS 12 и ниже. Но в iOS 13 я получаю сообщение об ошибке: «Добавление представления rootViewController вручную в иерархию представлений больше не поддерживается. Пожалуйста, позвольте UIWindow добавить представление rootViewController в саму иерархию представлений».
Я проверил на iOS12 и ниже, ниже код работает нормально. Но на iOS 13 у меня проблемы с представлением viewcontroller. Я напечатал на viewDidLoad, он печатается, но вид не появляется.
func presentInWindow(animated flag: Bool = true, completion: (() -> Void)? = nil) {
DispatchQueue.main.async {
var alertWindow: UIWindow?
alertWindow = UIWindow(frame: UIScreen.main.bounds)
alertWindow?.windowLevel = UIWindow.Level.alert + 1
alertWindow?.rootViewController = UIApplication.topViewController()
if let rootViewController = alertWindow?.rootViewController {
alertWindow?.makeKeyAndVisible()
rootViewController.present(self, animated: flag, completion: completion)
}
}
}
static func topViewController() -> UIViewController? {
var topViewController: UIViewController?
if #available(iOS 13.0, *) {
topViewController = shared.connectedScenes
.filter({$0.activationState == .foregroundActive})
.map({$0 as? UIWindowScene})
.compactMap({$0})
.first?.windows
.filter({$0.isKeyWindow}).first?.rootViewController
} else {
topViewController = shared.delegate?.window??.rootViewController
}
while true {
if let presented = topViewController?.presentedViewController {
topViewController = presented
} else if let nav = topViewController as? UINavigationController {
topViewController = nav.visibleViewController
} else {
break
}
}
return topViewController
}