Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Correct way to grab the current navigation controller

Tags:

ios

swift

Given that I have rootViewController which is UIApplication.shared.delegate?.window??.rootViewController, I want to grab the active navigation controller, if any.

So far what I've come up with:

guard var controller = rootViewController?.presentedViewController else { return rootViewController as? UINavigationController }
while let presented = controller.presentedViewController {
    controller = presented
}
controller = controller.navigationController ?? controller
return controller as? UINavigationController

Is this sufficient? A co-working gave me this solution but the part I don't understand is rootViewController?.presentedViewController. Shouldn't it be rootViewController?.presentingViewController?

like image 344
barndog Avatar asked Sep 14 '25 16:09

barndog


1 Answers

Use the below extension to grab the top most or current visible UIViewController and UINavigationController.

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

How to use?

let objViewcontroller = UIApplication.topViewController()

OR

let objNavigationController = UIApplication.topNavigation()
like image 191
Hitesh Surani Avatar answered Sep 17 '25 06:09

Hitesh Surani