How to get visible viewController from app delegate when using storyboard?

后端 未结 14 1671
小蘑菇
小蘑菇 2020-12-05 00:14

I have some viewControllers, and I don\'t use NavigationController. How can I get visible view controller in app delegate methods (e.g. appli

14条回答
  •  时光取名叫无心
    2020-12-05 01:00

    Here is a recursive, protocol-oriented approach in Swift. Can be extended to custom types but any kind of UIViewController subclass should work with the code below.

    public protocol ViewControllerContainer {
    
        var topMostViewController: UIViewController? { get }
    }
    
    extension UIViewController: ViewControllerContainer {
    
        public var topMostViewController: UIViewController? {
    
            if let presentedView = presentedViewController {
    
                return recurseViewController(presentedView)
            }
    
            return childViewControllers.last.map(recurseViewController)
        }
    }
    
    extension UITabBarController {
    
        public override var topMostViewController: UIViewController? {
    
            return selectedViewController.map(recurseViewController)
        }
    }
    
    extension UINavigationController {
    
        public override var topMostViewController: UIViewController? {
    
            return viewControllers.last.map(recurseViewController)
        }
    }
    
    extension UIWindow: ViewControllerContainer {
    
        public var topMostViewController: UIViewController? {
    
            return rootViewController.map(recurseViewController)
        }
    }
    
    func recurseViewController(viewController: UIViewController) -> UIViewController {
    
        return viewController.topMostViewController.map(recurseViewController) ?? viewController
    }
    

提交回复
热议问题