美文网首页
iOS. 获取最顶层viewController

iOS. 获取最顶层viewController

作者: 猿姑凉 | 来源:发表于2018-04-08 16:25 被阅读227次

    1 实现思路
      通过最底层的ViewController依次向上寻找,直到找到最顶层的ViewController,也就是从UIApplication的keyWindow的rootViewController开始寻找(如果有多个UIWindow则要考虑UIWindow的选择问题。

    在寻找的过程中,要分别考虑当前ViewController是UITabBarController和UINavigationController的情况,同时还要考虑到当前ViewController是否通过 presentViewController:animated:completion: 模态展示了其他ViewController。

    可解决菊花转不在最顶层的问题。

    2.实现方式

    方式一

    - (UIViewController *)topViewController {
        UIViewController *resultVC;
        resultVC = [self _topViewController:[[UIApplication sharedApplication].keyWindow rootViewController]];
        while (resultVC.presentedViewController) {
            resultVC = [self _topViewController:resultVC.presentedViewController];
        }
        return resultVC;
    }
    
    - (UIViewController *)_topViewController:(UIViewController *)vc {
        if ([vc isKindOfClass:[UINavigationController class]]) {
            return [self _topViewController:[(UINavigationController *)vc topViewController]];
        } else if ([vc isKindOfClass:[UITabBarController class]]) {
            return [self _topViewController:[(UITabBarController *)vc selectedViewController]];
        } else {
            return vc;
        }
        return nil;
    }
    

    方式二

    //获取当前屏幕显示的viewcontroller
    - (UIViewController *)getCurrentVC
    {
        UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
        
        UIViewController *currentVC = [self getCurrentVCFrom:rootViewController];
        
        return currentVC;
    }
    
    - (UIViewController *)getCurrentVCFrom:(UIViewController *)rootVC
    {
        UIViewController *currentVC;
        
        if ([rootVC presentedViewController]) {
            // 视图是被presented出来的
            rootVC = [rootVC presentedViewController];
        }
    
        if ([rootVC isKindOfClass:[UITabBarController class]]) {
            // 根视图为UITabBarController
            currentVC = [self getCurrentVCFrom:[(UITabBarController *)rootVC selectedViewController]];  
        } else if ([rootVC isKindOfClass:[UINavigationController class]]){
            // 根视图为UINavigationController
            currentVC = [self getCurrentVCFrom:[(UINavigationController *)rootVC visibleViewController]];  
        } else {
            // 根视图为非导航类 
            currentVC = rootVC;
        }
        
        return currentVC;
    }
    

    相关文章

      网友评论

          本文标题:iOS. 获取最顶层viewController

          本文链接:https://www.haomeiwen.com/subject/mwcmhftx.html