UIViewController+TopMostViewController.swift 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #if os(iOS) || os(tvOS)
  2. import UIKit
  3. extension UIViewController {
  4. private class var sharedApplication: UIApplication? {
  5. let selector = NSSelectorFromString("sharedApplication")
  6. return UIApplication.perform(selector)?.takeUnretainedValue() as? UIApplication
  7. }
  8. /// Returns the current application's top most view controller.
  9. open class var topMost: UIViewController? {
  10. guard let currentWindows = self.sharedApplication?.windows else { return nil }
  11. var rootViewController: UIViewController?
  12. for window in currentWindows {
  13. if let windowRootViewController = window.rootViewController, window.isKeyWindow {
  14. rootViewController = windowRootViewController
  15. break
  16. }
  17. }
  18. return self.topMost(of: rootViewController)
  19. }
  20. /// Returns the top most view controller from given view controller's stack.
  21. open class func topMost(of viewController: UIViewController?) -> UIViewController? {
  22. // presented view controller
  23. if let presentedViewController = viewController?.presentedViewController {
  24. return self.topMost(of: presentedViewController)
  25. }
  26. // UITabBarController
  27. if let tabBarController = viewController as? UITabBarController,
  28. let selectedViewController = tabBarController.selectedViewController {
  29. return self.topMost(of: selectedViewController)
  30. }
  31. // UINavigationController
  32. if let navigationController = viewController as? UINavigationController,
  33. let visibleViewController = navigationController.visibleViewController {
  34. return self.topMost(of: visibleViewController)
  35. }
  36. // UIPageController
  37. if let pageViewController = viewController as? UIPageViewController,
  38. pageViewController.viewControllers?.count == 1 {
  39. return self.topMost(of: pageViewController.viewControllers?.first)
  40. }
  41. // child view controller
  42. for subview in viewController?.view?.subviews ?? [] {
  43. if let childViewController = subview.next as? UIViewController {
  44. return self.topMost(of: childViewController)
  45. }
  46. }
  47. return viewController
  48. }
  49. }
  50. #endif