访问iOS应用程序的最前面的控制器

时间:2014-12-15 12:21:30

标签: ios swift

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

override func viewDidAppear(animated: Bool) {

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

}

但似乎rootViewController总是在我访问该属性时独立地引用故事板定义的第一个控制器。

我做错了什么或者我对rootViewController财产有误解?

2 个答案:

答案 0 :(得分: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您可以轻松地从快速代码中调用此UIWindow类别。

答案 1 :(得分:0)

好的,基于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中不起作用(如所写)。