iOS获取当前屏幕上的ViewController

//从网上找到的都是getCurrentViewController的方法部分,其实是并不能获取当前屏幕上的ViewController的,
//如:UITabbarController——>UINavigationController——>UIViewController——>presentViewController——>UINavigationController——>UIViewController. 
//这种流程的情景下,单单是getCurrentViewController方法就无法正确获取当前屏幕上的ViewController了。 
//于是我补充了getTopViewController:这个方法。
//获取当前屏幕显示的viewcontroller
- (UIViewController *)getCurrentViewController
{
    UIViewController *result = nil;
    
    UIWindow * window = [[UIApplication sharedApplication] keyWindow];
    if (window.windowLevel != UIWindowLevelNormal)
    {
        NSArray *windows = [[UIApplication sharedApplication] windows];
        for(UIWindow * tmpWin in windows)
        {
            if (tmpWin.windowLevel == UIWindowLevelNormal)
            {
                window = tmpWin;
                break;
            }
        }
    }
    
    UIView *frontView = [[window subviews] lastObject];
    
    id nextResponder = [frontView nextResponder];
    while ([nextResponder nextResponder]) {
        nextResponder = [nextResponder nextResponder];
    }
    
    if ([nextResponder isKindOfClass:[UIViewController class]])
        result = nextResponder;
    else
        result = window.rootViewController;

    
    return [self getTopViewController:result];
}

-(UIViewController *)getTopViewController:(UIViewController *)viewController {
    if ([viewController isKindOfClass:[UITabBarController class]]) {
        return [self getTopViewController:[(UITabBarController *)viewController selectedViewController]];
    } else if ([viewController isKindOfClass:[UINavigationController class]]) {
        return [self getTopViewController:[(UINavigationController *)viewController topViewController]];
    } else if (viewController.presentedViewController) {
        return [self getTopViewController:viewController.presentedViewController];
    } else {
        return viewController;
    }
}


你可能感兴趣的:(iOS获取当前屏幕上的ViewController)