使用UIWindow获取可见视图controller



所以,我将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];

最新更新