xx-li
9/19/2018 - 6:39 AM

获取app的根视图控制器和最上层控制器

获取app的根视图控制器和最上层控制器

/*
 获取应用的根视图控制器
 */
+ (UIViewController *)applicationRootViewController {
    UIWindow* window = [[[UIApplication sharedApplication] delegate] window];
    NSAssert(window, @"The window is empty");
    return window.rootViewController;
}

/*
 获取应用最上层的控制器。
 注意:此方法内部没有对childViewController做处理,返回的控制器可能包含childViewController。
 */
+ (UIViewController *)applicationTopViewController {
    UIViewController* currentViewController = [self applicationRootViewController];
    while (currentViewController) {
        if (currentViewController.presentedViewController) {
            currentViewController = currentViewController.presentedViewController;
        } else if ([currentViewController isKindOfClass:[UINavigationController class]]) {
            UINavigationController* navigationController = (UINavigationController* )currentViewController;
            currentViewController = [navigationController.childViewControllers lastObject];
        } else if ([currentViewController isKindOfClass:[UITabBarController class]]) {
            UITabBarController* tabBarController = (UITabBarController* )currentViewController;
            currentViewController = tabBarController.selectedViewController;
        } else {
            // 可能会存在childViewController, 由外部处理。
            return currentViewController;
        }
    }
    return currentViewController;
}