iOS 获取顶层视图控制器

294 阅读1分钟
在实际项目开发过程中,我们经常需要获取顶层视图控制器,来推出一些页面或者弹窗。那么如何获得顶层视图控制器呢

1、获取根视图控制器

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

2、如果根视图控制器是 UITabBarController,通过 selectedViewController 选中的视图控制器,递归循环判断

if ([rootViewController isKindOfClass:[UITabBarController class]]) {
    UITabBarController* tabBarController = (UITabBarController*)rootViewController;
    return [AppDelegate topViewControllerWithRootViewController:tabBarController.selectedViewController];
} 

3、如果根视图控制器是 UINavigationController,通过visibleViewController 获取导航控制器的子控制器,递归循环判断

if ([rootViewController isKindOfClass:[UINavigationController class]]) {
    UINavigationController *navigationController = (UINavigationController*)rootViewController;
    if ([navigationController.visibleViewController isKindOfClass:[UIAlertController class]]) {
        for (UIViewController *viewcontroller in navigationController.viewControllers) {
            if ([tabBarController.viewcontrollers containsObject:viewcontroller]) {
                return viewcontroller;
            }
         }
      }
  return [AppDelegate topViewControllerWithRootViewController:navigationController.visibleViewController];

    }

4、如果该视图控制器模态推出了新视图控制器,获取新视图控制器进入递归循环

 if (rootViewController.presentedViewController) {
    UIViewController* presentedViewController = rootViewController.presentedViewController;
return [AppDelegate topViewControllerWithRootViewController:presentedViewController];

    }

5、排除以上几种情况,直接返回根视图

 else {
    return rootViewController;
}