所以,我将self
作为UIWindow
,但是当前时刻我如何获得可见的ViewController?
在swift3:
中func getVisibleViewController(_ rootViewController: UIViewController?) -> UIViewController? {
var rootVC = rootViewController
if rootVC == nil {
rootVC = UIApplication.shared.keyWindow?.rootViewController
}
if rootVC?.presentedViewController == nil {
return rootVC
}
if let presented = rootVC?.presentedViewController {
if presented.isKind(of: UINavigationController.self) {
let navigationController = presented as! UINavigationController
return navigationController.viewControllers.last!
}
if presented.isKind(of: UITabBarController.self) {
let tabBarController = presented as! UITabBarController
return tabBarController.selectedViewController!
}
return getVisibleViewController(presented)
}
return nil
}
您应该查看此答案。它的要旨是您从窗口的.rootViewController
开始。在我自己的代码中(使用UINavigationController
作为.rootViewController
,我使用此(在AppDelegate
中):
if let nvc = self.window?.rootViewController as? UINavigationController {
if let mvc = nvc.topViewController as? MasterViewController {
// ... do something
} else if let dvc = nvc.topViewController as? DetailViewController {
// ... do something
}
}
请注意,如果您使用默认模板作为主数据应用程序,则需要考虑插入本身的SplitViewController
,但从样板代码中这应该很明显。
如果添加了儿童视图控制器:
let viewControllersVisible = self.rootViewController?.childViewControllers.filter({ $0.isVisible && $0.view.window })
这返回视图层次结构中添加的UIViewControllers
数组,它没有说明用户是否实际上可以看到这些视图控制器,取决于您的层次结构。
如果您只是示意一个视图控制器:
let viewControllerVisible = self.rootViewController?.presentedViewController
inorder以获取层次结构中最高视图控制器的引用,请尝试以下代码
UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController;
while (topController.presentedViewController)
{
topController = topController.presentedViewController;
}
return topController;
如果要在窗口上最上方的视图,请尝试。
[[[[UIApplication sharedApplication] keyWindow] subviews] lastObject];