Get top most UIViewController

后端 未结 24 2274
别那么骄傲
别那么骄傲 2020-11-22 14:47

I can\'t seem to get the top most UIViewController without access to a UINavigationController. Here is what I have so far:

UIApplic         


        
24条回答
  •  盖世英雄少女心
    2020-11-22 15:38

    For Swift 5+, iOS 13+

    extension UIViewController {
        static func topMostViewController() -> UIViewController? {
            if #available(iOS 13.0, *) {
                let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
                return keyWindow?.rootViewController?.topMostViewController()
            }
            
            return UIApplication.shared.keyWindow?.rootViewController?.topMostViewController()
        }
        
        func topMostViewController() -> UIViewController? {
            if let navigationController = self as? UINavigationController {
                return navigationController.topViewController?.topMostViewController()
            }
            else if let tabBarController = self as? UITabBarController {
                if let selectedViewController = tabBarController.selectedViewController {
                    return selectedViewController.topMostViewController()
                }
                return tabBarController.topMostViewController()
            }
                
            else if let presentedViewController = self.presentedViewController {
                return presentedViewController.topMostViewController()
            }
            
            else {
                return self
            }
        }
    }
    

    Usage:

    When you are getting topMostViewController without instance of UIViewController

    guard let viewController = UIViewController.topMostViewController() else { return }
    print(viewController)
    

    When you are getting topMostViewController of instance of UIViewController

    let yourVC = UIViewController()
    guard let vc = yourVC.topMostViewController() else { return }
    print(vc)
    

提交回复
热议问题