我尝试使用此代码在用户导航期间访问应用程序的最前端控制器:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
println(UIApplication.sharedApplication().keyWindow?.rootViewController)
}
但似乎rootViewController
总是在我访问该属性时独立地引用故事板定义的第一个控制器。
我做错了什么或者我对rootViewController
财产有误解?
答案 0 :(得分:1)
rootViewController
确实是the topmost, ultimate view controller owned by UIWindow。
要获取当前显示的视图控制器,您需要沿着控制器层次结构向下走。 Here is an Objective-C category that you can add to your application和using 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中不起作用(如所写)。