iOS 獲取根控制器的幾種方法

在開發(fā)過程中,當我們在View里面處理一些事件的時候,可能會用到當前viewController、NavigationController,或者tabBarController去處理一些事件,實現(xiàn)當然,方法有很多種,比如通知代理block這些應該都可以實現(xiàn),但是今天我向大家分享的幾種方法就是通過Window直接拿到你想要的控制器。

1.獲取當前所在的TabBarController

+(UITabBarController *)currentTtabarController
{
    UIWindow * window = [[UIApplication sharedApplication] keyWindow];
    UIViewController *tabbarController = window.rootViewController;
    if ([tabbarController isKindOfClass:[UITabBarController class]]) {
        return (UITabBarController *)tabbarController;
    }
    return nil;
}

2.獲取當前TabBarController所選中的navigationController

+(UINavigationController *)currentTabbarSelectedNavigationController
{
    UIWindow * window = [[UIApplication sharedApplication] keyWindow];
    UIViewController *rootVC = window.rootViewController;
    if ([rootVC isKindOfClass:[UINavigationController class]]) {
        return (UINavigationController *)rootVC;
    }else if([rootVC isKindOfClass:[UITabBarController class]]){
        UITabBarController *tabarController = [self currentTtabarController];
        UINavigationController *selectedNV = (UINavigationController *)tabarController.selectedViewController;
        if ([selectedNV isKindOfClass:[UINavigationController class]]) {
            return selectedNV;
        }
    }

    return nil;
}

3.獲取當前控制器

  • 方法一
+(UIViewController*)getCurrentViewController{
    UINavigationController *selectedNV = [self currentTabbarSelectedNavigationController];
    if (selectedNV.viewControllers.count > 0) {
        return [selectedNV.viewControllers lastObject];
    }
    return nil;
}

-方法二

+ (UIViewController *)cpx_getCurrentDisplayController {
    __block UIWindow *normalWindow = [[UIApplication sharedApplication] keyWindow];
    NSArray *windows = [[UIApplication sharedApplication] windows];
    if (normalWindow.windowLevel != UIWindowLevelNormal) {
        [windows enumerateObjectsUsingBlock:^(__kindof UIWindow * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            if (obj.windowLevel == UIWindowLevelNormal) {
                normalWindow = obj;
                *stop        = YES;
            }
        }];
    }
    
    return [self cpx_getTopViewController:normalWindow.rootViewController];
}
+ (UIViewController *)cpx_getTopViewController:(UIViewController *)inViewController {
    while (inViewController.presentedViewController) {
        inViewController = inViewController.presentedViewController;
    }
    
    if ([inViewController isKindOfClass:[UITabBarController class]]) {
        UIViewController *selectedVC = [self cpx_getTopViewController:((UITabBarController *)inViewController).selectedViewController];
        return selectedVC;
    } else if ([inViewController isKindOfClass:[UINavigationController class]]) {
        UIViewController *selectedVC = [self cpx_getTopViewController:((UINavigationController *)inViewController).visibleViewController];
        return selectedVC;
    } else {
        return inViewController;
    }
}

4.通過View獲取View的父控制器

+ (UIViewController *)cpx_getParentControllerFromView:(UIView *)view
{
    UIResponder *responder = [view nextResponder];
    while (responder)
    {
        if ([responder isKindOfClass:[UIViewController class]])
        {
            return (UIViewController *)responder;
        }
        responder = [responder nextResponder];
    }
    return nil;
}

5.通過遞歸方法遍歷當前View的所有子試圖

+(void)getMysubViewsWithViews:(UIView *)view{
   NSArray *arrayViews = view.subviews;
    for (UIView * obj in arrayViews) {
        if ([obj isKindOfClass:[MyView class]]) {
            NSLog(@"找到了 %@",MyView);
        }
        [self getMysubViewsWithViews:obj];
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容