Warning: Attempt to present * on * whose view is not in the window hierarchy - swift

前端 未结 17 1002
花落未央
花落未央 2020-11-30 22:03

I\'m trying to present a ViewController if there is any saved data in the data model. But I get the following error:

Warning: A

17条回答
  •  没有蜡笔的小新
    2020-11-30 22:18

    All implementation for topViewController here are not fully supporting cases when you have UINavigationController or UITabBarController, for those two you need a bit different handling:

    For UITabBarController and UINavigationController you need a different implementation.

    Here is code I'm using to get topMostViewController:

    protocol TopUIViewController {
        func topUIViewController() -> UIViewController?
    }
    
    extension UIWindow : TopUIViewController {
        func topUIViewController() -> UIViewController? {
            if let rootViewController = self.rootViewController {
                return self.recursiveTopUIViewController(from: rootViewController)
            }
    
            return nil
        }
    
        private func recursiveTopUIViewController(from: UIViewController?) -> UIViewController? {
            if let topVC = from?.topUIViewController() { return recursiveTopUIViewController(from: topVC) ?? from }
            return from
        }
    }
    
    extension UIViewController : TopUIViewController {
        @objc open func topUIViewController() -> UIViewController? {
            return self.presentedViewController
        }
    }
    
    extension UINavigationController {
        override open func topUIViewController() -> UIViewController? {
            return self.visibleViewController
        }
    }
    
    extension UITabBarController {
        override open func topUIViewController() -> UIViewController? {
            return self.selectedViewController ?? presentedViewController
        }
    }
    

提交回复
热议问题