How to find topmost view controller on iOS

后端 未结 30 3074
遥遥无期
遥遥无期 2020-11-22 08:40

I\'ve run into a couple of cases now where it would be convenient to be able to find the \"topmost\" view controller (the one responsible for the current view), but haven\'t

30条回答
  •  说谎
    说谎 (楼主)
    2020-11-22 08:55

    A concise yet comprehensive solution in Swift 4.2, takes into account UINavigationControllers, UITabBarControllers, presented and child view controllers:

    extension UIViewController {
      func topmostViewController() -> UIViewController {
        if let navigationVC = self as? UINavigationController,
          let topVC = navigationVC.topViewController {
          return topVC.topmostViewController()
        }
        if let tabBarVC = self as? UITabBarController,
          let selectedVC = tabBarVC.selectedViewController {
          return selectedVC.topmostViewController()
        }
        if let presentedVC = presentedViewController {
          return presentedVC.topmostViewController()
        }
        if let childVC = children.last {
          return childVC.topmostViewController()
        }
        return self
      }
    }
    
    extension UIApplication {
      func topmostViewController() -> UIViewController? {
        return keyWindow?.rootViewController?.topmostViewController()
      }
    }
    

    Usage:

    let viewController = UIApplication.shared.topmostViewController()
    

提交回复
热议问题