【问题标题】:Accessing the frontmost controller of an iOS App访问 iOS App 的最前端控制器
【发布时间】:2015-02-13 13:05:57
【问题描述】:

我正在尝试使用以下代码在用户导航期间访问应用程序的最前面的控制器:

override func viewDidAppear(animated: Bool) {

    super.viewDidAppear(animated)
    println(UIApplication.sharedApplication().keyWindow?.rootViewController)

}

但当我访问该属性时,rootViewController 似乎总是指由情节提要独立定义的第一个控制器。

是我做错了什么还是我误解了rootViewController 属性?

【问题讨论】:

  • 你的意思是导航栈中的第一个视图控制器吗?
  • 如果你使用 UINavigationController,你可以只使用 topViewController 属性。 (例如,self.navigationController.topViewController)。
  • 是一个以模态方式呈现的 viewController,但我需要通过测试 (XCTest) 访问它

标签: ios swift


【解决方案1】:

rootViewController 确实是the topmost, ultimate view controller owned by UIWindow

要获取当前显示的视图控制器,您需要遍历控制器层次结构。 Here is an Objective-C category that you can add to your applicationusing a bridging header 您可以轻松地从您的 swift 代码中调用此 UIWindow 类别。

【讨论】:

    【解决方案2】:

    好的,根据 Michael 指出的代码,我编写了一些 Swift (1.2) 代码来做同样的事情。你可以把它作为 UIViewController 的扩展添加(就像我做的那样)、UIApplication,或者简单地把它变成一个全局函数。

    extension UIViewController {
    
        static func getVisibleViewController () -> UIViewController {
            let rootViewController = UIApplication.sharedApplication().keyWindow?.rootViewController
    
            return getVisibleViewControllerFrom(rootViewController!)
        }
    
        static func getVisibleViewControllerFrom(viewController: UIViewController) -> UIViewController {
            let vcToReturn: UIViewController
    
            if let navController = viewController as? UINavigationController {
                vcToReturn = UIViewController.getVisibleViewControllerFrom(navController.visibleViewController)
            }
            else if let tabBarController = viewController as? UITabBarController {
                vcToReturn = UIViewController.getVisibleViewControllerFrom(tabBarController.selectedViewController!)
            }
            else {
                if let presentedViewController = viewController.presentedViewController {
                    vcToReturn = UIViewController.getVisibleViewControllerFrom(presentedViewController)
                }
                else {
                    vcToReturn = viewController
                }
            }
    
            return vcToReturn
        }
    
    }
    

    你可以这样称呼它:

    let visibleViewController = UIViewController.getVisibleViewController()
    

    希望这会有所帮助。

    安德鲁

    PS 我还没有在 Swift 2.0 中尝试过这个,所以我不能保证它会在没有问题的情况下工作。我知道它在 Swift 1.1 或 1.0 中不起作用(如所写)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 2015-11-30
      • 1970-01-01
      相关资源
      最近更新 更多