项目中经常需要拿到当前的视图控制器,但是每个项目结构不同,每次都要针对某个项目去写一个获取当前控制器的方法,感觉很不爽,今天终于抽时间搞了一套通用的方法。分享给大家,如果有不对的地方,望大神指正。
实现:
#define kAppDelegate [UIApplication sharedApplication].delegate
#pragma mark - 获取当前控制器
/** 获取当前控制器*/
+ (UIViewController *)currentViewController{
if ([kAppDelegate.window.rootViewController isKindOfClass:UINavigationController.class] || [kAppDelegate.window.rootViewController isKindOfClass:UITabBarController.class]) {
return [self getVisibleViewControllerWithRootVC:kAppDelegate.window.rootViewController];
}else{
UIViewController *VC = kAppDelegate.window.rootViewController;
if (VC.presentedViewController) {
if ([VC.presentedViewController isKindOfClass:UINavigationController.class]||
[VC.presentedViewController isKindOfClass:UITabBarController.class]) {
return [self getVisibleViewControllerWithRootVC:VC.presentedViewController];
}else{
return VC.presentedViewController;
}
}
else{
return VC;
}
}
}
/**
* 私有方法
* rootVC必须是UINavigationController 或 UITabBarController 及其子类
*/
+ (UIViewController *)getVisibleViewControllerWithRootVC:(UIViewController *)rootVC{
if ([rootVC isKindOfClass:UINavigationController.class]) {
UINavigationController *nav = (UINavigationController *)rootVC;
// 如果有modal view controller并且弹起的是导航控制器,返回其topViewController
if ([nav.visibleViewController isKindOfClass:UINavigationController.class]) {
UINavigationController *presentdNav = (UINavigationController *)nav.visibleViewController;
return presentdNav.visibleViewController;
}
else if ([nav.visibleViewController isKindOfClass:UITabBarController.class]){
return [self getVisibleViewControllerWithRootVC:nav.visibleViewController];
}
// Return modal view controller if it exists. Otherwise the top view controller.
else{
return nav.visibleViewController;
}
}
else if([rootVC isKindOfClass:UITabBarController.class]){
UITabBarController *tabVC = (UITabBarController *)rootVC;
UINavigationController *nav = (UINavigationController *)tabVC.selectedViewController;
return [self getVisibleViewControllerWithRootVC:nav];
}else{
return rootVC;
}
}
使用的时候直接通过工具类 调用类方法 currentViewController即可