在实际项目开发过程中,我们经常需要获取顶层视图控制器,来推出一些页面或者弹窗。那么如何获得顶层视图控制器呢
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;
}