Я использую такой код для замены окна UIApplication rootViewController
extension UIWindow {
func set(rootViewController newViewController: UIViewController, withTransition transition: CATransition? = nil) {
let previousViewController = self.rootViewController
if let transition = transition {
// Add the transition
layer.add(transition, forKey: kCATransition)
}
self.rootViewController = newViewController
// Update status bar appearance using the new view controllers appearance - animate if needed
if UIView.areAnimationsEnabled {
UIView.animate(withDuration: CATransaction.animationDuration()) {
newViewController.setNeedsStatusBarAppearanceUpdate()
}
} else {
newViewController.setNeedsStatusBarAppearanceUpdate()
}
/// The presenting view controllers view doesn't get removed from the window as its currently transistioning and presenting a view controller
if let transitionViewClass = NSClassFromString("UITransitionView") {
for subview in self.subviews where subview.isKind(of: transitionViewClass) {
subview.removeFromSuperview()
}
}
if let previousViewController = previousViewController {
// Allow the view controller to be deallocated
previousViewController.dismiss(animated: false) {
// Remove the root view in case its still showing
previousViewController.view.removeFromSuperview()
}
}
}
}
Это почти прекрасно работает, потому что установка rootViewController не умножает ViewControllers в View Hierarchy Debugger.
Но у него есть одна оговорка, так как замена View Controller не связана с self.view.window. Отсутствие базового окна приводит, например, к тому, что view.convert (point, to: nil) не работает правильно, поскольку этого окна нет: /
Любая помощь, почему ViewController теряет связь с окном