有时候我们需要知道当前看到的最顶层控制器VC是哪一个,但是又没有其余判断条件,比如判断当前用户是否弹出了登录控制器VC或者需要在视图中去操作顶层VC,以此来做其他另外的操作.那么我们需要知道和了解VC层的结构。一般都会从根控制器开始遍历找起,那么需要判断是否往上寻找的存在以下几种情况:1.是否还有模态视图控制器(vc.presentedViewController) 2.是否是导航控制器(UINavigationController) 3.是否是分栏控制器(UITabBarController) 4.是否是主从控制器(UISplitViewController),一般在ipad中使用需要判断.
基于以上四点,那么处理就清晰了。
1.根控制器获取,执行UIViewController* viewController = [UIApplication sharedApplication].delegate.window.rootViewController;
2.递归遍历。存在模态VC,继续递归;是UINavigationController,用topViewController递归;是UITabBarController,用selectedViewController递归;是UISplitViewController,则用viewControllers.lastObject来递归,直至都不满足,那么就是找到的控制器VC了,返回该VC即可。
这里代码贴上如下:
//获取顶层VC
+ (UIViewController*)currentViewController{
UIViewController* viewController = [UIApplication sharedApplication].delegate.window.rootViewController;
return[selffindBestViewController:viewController];
}
//递归方法
+ (UIViewController*)findBestViewController:(UIViewController*)vc {
if (vc.presentedViewController) {
// Return presented view controller
return [self findBestViewController:vc.presentedViewController];
}else if ([vc isKindOfClass:[UISplitViewController class]]) {
// Return right hand side
UISplitViewController* svc = (UISplitViewController*) vc;
if (svc.viewControllers.count > 0)
return [self findBestViewController:svc.viewControllers.lastObject];
else
returnvc;
}else if ([vc isKindOfClass:[UINavigationController class]]) {
// Return top view
UINavigationController* svc = (UINavigationController*) vc;
if (svc.viewControllers.count > 0)
return [self findBestViewController:svc.topViewController];
else
returnvc;
}else if ([vc isKindOfClass:[UITabBarController class]]) {
// Return visible view
UITabBarController* svc = (UITabBarController*) vc;
if (svc.viewControllers.count > 0)
return [self findBestViewController:svc.selectedViewController];
else
returnvc;
}else{
returnvc;
}
}
亲测可用,直接复制使用就可以了!