Get top most UIViewController Get top most UIViewController swift swift

Get top most UIViewController


presentViewController shows a view controller. It doesn't return a view controller. If you're not using a UINavigationController, you're probably looking for presentedViewController and you'll need to start at the root and iterate down through the presented views.

if var topController = UIApplication.sharedApplication().keyWindow?.rootViewController {    while let presentedViewController = topController.presentedViewController {        topController = presentedViewController    }    // topController should now be your topmost view controller}

For Swift 3+:

if var topController = UIApplication.shared.keyWindow?.rootViewController {    while let presentedViewController = topController.presentedViewController {        topController = presentedViewController    }    // topController should now be your topmost view controller}

For iOS 13+

let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.firstif var topController = keyWindow?.rootViewController {    while let presentedViewController = topController.presentedViewController {        topController = presentedViewController    }// topController should now be your topmost view controller}


have this extension

Swift 2.*

extension UIApplication {    class func topViewController(controller: UIViewController? = UIApplication.sharedApplication().keyWindow?.rootViewController) -> UIViewController? {        if let navigationController = controller as? UINavigationController {            return topViewController(navigationController.visibleViewController)        }        if let tabController = controller as? UITabBarController {            if let selected = tabController.selectedViewController {                return topViewController(selected)            }        }        if let presented = controller?.presentedViewController {            return topViewController(presented)        }        return controller    }}

Swift 3

extension UIApplication {    class func topViewController(controller: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {        if let navigationController = controller as? UINavigationController {            return topViewController(controller: navigationController.visibleViewController)        }        if let tabController = controller as? UITabBarController {            if let selected = tabController.selectedViewController {                return topViewController(controller: selected)            }        }        if let presented = controller?.presentedViewController {            return topViewController(controller: presented)        }        return controller    }}

You can you use this anywhere on your controller

if let topController = UIApplication.topViewController() {}


For swift 4 / 5 + to get topmost viewController

// MARK: UIApplication extensionsextension UIApplication {    class func getTopViewController(base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {        if let nav = base as? UINavigationController {            return getTopViewController(base: nav.visibleViewController)        } else if let tab = base as? UITabBarController, let selected = tab.selectedViewController {            return getTopViewController(base: selected)        } else if let presented = base?.presentedViewController {            return getTopViewController(base: presented)        }        return base    }}

How to use

if let topVC = UIApplication.getTopViewController() {   topVC.view.addSubview(forgotPwdView)}