业务上,尤其是SDK的工程中,有时候需要在集中的地方获取当前显示的ViewController,便于present/dismiss或者push/pop的操作,又不会跟特定的业务ViewController产生依赖,可以用如下的方式,获取顶层的ViewController
//获取当前屏幕显示的viewcontroller
- (UIViewController *)getCurrentVC
{
UIViewController *rootViewController = [self getViewControllerWindow].rootViewController;
UIViewController *currentVC = [self getCurrentVCFrom:rootViewController];
return currentVC;
}
//获取RootViewController所在的window
- (UIWindow*)getViewControllerWindow{
UIWindow *window = [UIApplication sharedApplication].delegate.window;
if (window.windowLevel != UIWindowLevelNormal) {
NSArray *windows = [UIApplication sharedApplication].windows;
for (UIWindow *target in windows) {
if (target.windowLevel == UIWindowLevelNormal) {
window = target;
break;
}
}
}
return window;
}
- (UIViewController *)getCurrentVCFrom:(UIViewController *)rootVC
{
UIViewController *currentVC;
if ([rootVC presentedViewController]) {
// 视图是被presented出来的
while ([rootVC presentedViewController]) {
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;
}
网友评论