Search code examples
xcode10ios12swift4.2

topViewController in iOS 12 / Xcode 10


So, I've updated to Xcode 10 and iOS 12 today and now I'm getting the following error message when I call topViewController from UINavigationController:

Ambiguous use of 'topViewController'

if let myVC = navigationController.topViewController as? MyViewController {}

Even though the following code works just fine.

if let myVC = navigationController.visibleViewController as? MyViewController {}

Does anyone know any changes in iOS 12 regarding this?


Solution

  • I can suggest you this func for getting topViewContoller as an extension. Easy to use as you guess.

    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
        }
    }
    

    Usage:

    UIApplication.topViewController()