Skip to content

Instantly share code, notes, and snippets.

@wanbok
Created August 29, 2016 04:06
Show Gist options
  • Save wanbok/a93c11eb6ece8fecdc94372976357ff4 to your computer and use it in GitHub Desktop.
Save wanbok/a93c11eb6ece8fecdc94372976357ff4 to your computer and use it in GitHub Desktop.
TopMostViewController
import UIKit
extension UIViewController {
/// Returns the current application's top most view controller.
public class func topMostViewController() -> UIViewController? {
let rootViewController = UIApplication.sharedApplication().windows.first?.rootViewController
return self.topMostViewControllerOfViewController(rootViewController)
}
/// Returns the top most view controller from given view controller's stack.
class func topMostViewControllerOfViewController(viewController: UIViewController?) -> UIViewController? {
// presented view controller. It should be considered at the first.
if let presentedViewController = viewController?.presentedViewController {
return self.topMostViewControllerOfViewController(presentedViewController)
}
// UITabBarController
if let tabBarController = viewController as? UITabBarController,
let selectedViewController = tabBarController.selectedViewController {
return self.topMostViewControllerOfViewController(selectedViewController)
}
// UINavigationController
if let navigationController = viewController as? UINavigationController,
let visibleViewController = navigationController.visibleViewController {
return self.topMostViewControllerOfViewController(visibleViewController)
}
// child view controller
for subview in viewController?.view?.subviews ?? [] {
if let childViewController = subview.nextResponder() as? UIViewController {
return self.topMostViewControllerOfViewController(childViewController)
}
}
return viewController
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment