How to find topmost view controller on iOS

后端 未结 30 2317
遥遥无期
遥遥无期 2020-11-22 08:40

I\'ve run into a couple of cases now where it would be convenient to be able to find the \"topmost\" view controller (the one responsible for the current view), but haven\'t

30条回答
  •  孤街浪徒
    2020-11-22 09:19

    This solution is the most complete. It takes in consideration: UINavigationController UIPageViewController UITabBarController And the topmost presented view controller from the top view controller

    The example is in Swift 3.

    There are 3 overloads

    //Get the topmost view controller for the current application.
    public func MGGetTopMostViewController() -> UIViewController?  {
    
        if let currentWindow:UIWindow = UIApplication.shared.keyWindow {
            return MGGetTopMostViewController(fromWindow: currentWindow)
        }
    
        return nil
    }
    
    //Gets the topmost view controller from a specific window.
    public func MGGetTopMostViewController(fromWindow window:UIWindow) -> UIViewController? {
    
        if let rootViewController:UIViewController = window.rootViewController
        {
            return MGGetTopMostViewController(fromViewController:  rootViewController)
        }
    
        return nil
    }
    
    
    //Gets the topmost view controller starting from a specific UIViewController
    //Pass the rootViewController into this to get the apps top most view controller
    public func MGGetTopMostViewController(fromViewController viewController:UIViewController) -> UIViewController {
    
        //UINavigationController
        if let navigationViewController:UINavigationController = viewController as? UINavigationController {
            let viewControllers:[UIViewController] = navigationViewController.viewControllers
            if navigationViewController.viewControllers.count >= 1 {
                return MGGetTopMostViewController(fromViewController: viewControllers[viewControllers.count - 1])
            }
        }
    
        //UIPageViewController
        if let pageViewController:UIPageViewController = viewController as? UIPageViewController {
            if let viewControllers:[UIViewController] = pageViewController.viewControllers {
                if viewControllers.count >= 1 {
                    return MGGetTopMostViewController(fromViewController: viewControllers[0])
                }
            }
        }
    
        //UITabViewController
        if let tabBarController:UITabBarController = viewController as? UITabBarController {
            if let selectedViewController:UIViewController = tabBarController.selectedViewController {
                return MGGetTopMostViewController(fromViewController: selectedViewController)
            }
        }
    
        //Lastly, Attempt to get the topmost presented view controller
        var presentedViewController:UIViewController! = viewController.presentedViewController
        var nextPresentedViewController:UIViewController! = presentedViewController?.presentedViewController
    
        //If there is a presented view controller, get the top most prensentedViewController and return it.
        if presentedViewController != nil {
            while nextPresentedViewController != nil {
    
                //Set the presented view controller as the next one.
                presentedViewController = nextPresentedViewController
    
                //Attempt to get the next presented view controller
                nextPresentedViewController = presentedViewController.presentedViewController
            }
            return presentedViewController
        }
    
        //If there is no topmost presented view controller, return the view controller itself.
        return viewController
    }
    

提交回复
热议问题