Get top most UIViewController

后端 未结 24 2140
别那么骄傲
别那么骄傲 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:37

    import UIKit
    
    extension UIApplication {
    
        // MARK: Choose keyWindow as per your choice
        var currentWindow: UIWindow? {
            connectedScenes
            .filter({$0.activationState == .foregroundActive})
            .map({$0 as? UIWindowScene})
            .compactMap({$0})
            .first?.windows
            .filter({$0.isKeyWindow}).first
        }
    
        // MARK: Choose keyWindow as per your choice
        var keyWindow: UIWindow? {
            UIApplication.shared.windows.first { $0.isKeyWindow }
        }
    
        class func topMostViewController(base: UIViewController? = UIApplication.shared.currentWindow?.rootViewController) -> UIViewController? {
    
            if let nav = base as? UINavigationController {
                return topMostViewController(base: nav.visibleViewController)
            }
    
            if let tab = base as? UITabBarController {
                let moreNavigationController = tab.moreNavigationController
    
                if let top = moreNavigationController.topViewController, top.view.window != nil {
                    return topMostViewController(base: top)
                } else if let selected = tab.selectedViewController {
                    return topMostViewController(base: selected)
                }
            }
            if let presented = base?.presentedViewController {
                return topMostViewController(base: presented)
            }
            return base
        }
    }
    

提交回复
热议问题