UIApplication устанавливает rootViewController, сохраняя связь UIWindow в новом ViewController view.window - PullRequest
0 голосов
/ 13 июня 2019

Я использую такой код для замены окна 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 теряет связь с окном

...