I can\'t seem to get the top most UIViewController without access to a UINavigationController. Here is what I have so far:
UIApplic
For Swift 5+, iOS 13+
extension UIViewController {
static func topMostViewController() -> UIViewController? {
if #available(iOS 13.0, *) {
let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
return keyWindow?.rootViewController?.topMostViewController()
}
return UIApplication.shared.keyWindow?.rootViewController?.topMostViewController()
}
func topMostViewController() -> UIViewController? {
if let navigationController = self as? UINavigationController {
return navigationController.topViewController?.topMostViewController()
}
else if let tabBarController = self as? UITabBarController {
if let selectedViewController = tabBarController.selectedViewController {
return selectedViewController.topMostViewController()
}
return tabBarController.topMostViewController()
}
else if let presentedViewController = self.presentedViewController {
return presentedViewController.topMostViewController()
}
else {
return self
}
}
}
Usage:
When you are getting topMostViewController without instance of UIViewController
guard let viewController = UIViewController.topMostViewController() else { return }
print(viewController)
When you are getting topMostViewController of instance of UIViewController
let yourVC = UIViewController()
guard let vc = yourVC.topMostViewController() else { return }
print(vc)