在iOS开发中,我们经常性会需要获取当前页面的ViewController,也就是我们常说最顶层的ViewController或正在展示的ViewController,然后需要最顶层的ViewController进行一些操作。
例如在最顶层的ViewController上展示一个UIAlertController,或者在最顶层的ViewController上present或push另一个ViewController,以及进行其他的一些操作。
方法一:
- (UIViewController *)topViewController {
//第一步:获取根视图
UIViewController *resultVC = [self _topViewController:[[UIApplication sharedApplication].keyWindow rootViewController]];
//第二步:从根视图一直向上寻找顶层视图
//注:A控制器跳转到B控制器,A.presentedViewController = B
while (resultVC.presentedViewController) {
//判断控制器的类型
resultVC = [self getTopViewController:resultVC.presentedViewController];
}
return resultVC;
}
- (UIViewController *)getTopViewController:(UIViewController *)vc {
if ([vc isKindOfClass:[UINavigationController class]]) {
// 类型为导航栏控制器,返回栈顶控制器
return [self getTopViewController:[(UINavigationController *)vc topViewController]];
} else if ([vc isKindOfClass:[UITabBarController class]]) {
// 类型为分栏控制器,返回当前的控制器
return [self getTopViewController:[(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;
}