iOS中获取最顶层VC的方式

        有时候我们需要知道当前看到的最顶层控制器VC是哪一个,但是又没有其余判断条件,比如判断当前用户是否弹出了登录控制器VC或者需要在视图中去操作顶层VC,以此来做其他另外的操作.那么我们需要知道和了解VC层的结构。一般都会从根控制器开始遍历找起,那么需要判断是否往上寻找的存在以下几种情况:1.是否还有模态视图控制器(vc.presentedViewController)  2.是否是导航控制器(UINavigationController)  3.是否是分栏控制器(UITabBarController) 4.是否是主从控制器(UISplitViewController),一般在ipad中使用需要判断.

基于以上四点,那么处理就清晰了。

1.根控制器获取,执行UIViewController* viewController = [UIApplication sharedApplication].delegate.window.rootViewController;

2.递归遍历。存在模态VC,继续递归;是UINavigationController,用topViewController递归;是UITabBarController,用selectedViewController递归;是UISplitViewController,则用viewControllers.lastObject来递归,直至都不满足,那么就是找到的控制器VC了,返回该VC即可。

这里代码贴上如下:

//获取顶层VC

+ (UIViewController*)currentViewController{

    UIViewController* viewController = [UIApplication sharedApplication].delegate.window.rootViewController;

    return[selffindBestViewController:viewController];

}

//递归方法

+ (UIViewController*)findBestViewController:(UIViewController*)vc {

    if (vc.presentedViewController) {

        // Return presented view controller

        return [self findBestViewController:vc.presentedViewController];

    }else if ([vc isKindOfClass:[UISplitViewController class]]) {

        // Return right hand side

        UISplitViewController* svc = (UISplitViewController*) vc;

        if (svc.viewControllers.count > 0)

            return [self findBestViewController:svc.viewControllers.lastObject];

        else

            returnvc;

    }else if ([vc isKindOfClass:[UINavigationController class]]) {

        // Return top view

        UINavigationController* svc = (UINavigationController*) vc;

        if (svc.viewControllers.count > 0)

            return [self findBestViewController:svc.topViewController];

        else

            returnvc;

    }else if ([vc isKindOfClass:[UITabBarController class]]) {

        // Return visible view

        UITabBarController* svc = (UITabBarController*) vc;

        if (svc.viewControllers.count > 0)

            return [self findBestViewController:svc.selectedViewController];

        else

            returnvc;

    }else{

        returnvc;

    }

}

亲测可用,直接复制使用就可以了!

你可能感兴趣的:(iOS中获取最顶层VC的方式)