利用visibleViewController和topViewC

2020-08-13  本文已影响0人  迷失的信徒
UINavigationController 中有visibleViewController和topViewController

-visibleViewController当前显示的控制器
-topViewController是某个导航栈的栈定视图
-visibleViewController跟导航栈没关系,只是当前显示的控制器,也就是说任意一个导航栏的visibleViewController所返回的值应该是一样的;
-topViewController是导航栈的栈顶视图,和导航栏控制器相关,换句话说如果在同一个导航栈,visibleViewControllertopViewController是没什么区别的。

方法一
#define APP_Delegate [[UIApplication sharedApplication] delegate]
/*
 * 获取当前屏幕显示的 ViewController
 */
- (UIViewController *)getCurrentVC{
    UIViewController *rootViewController = [[APP_Delegate window] rootViewController];
    //获取当前屏幕显示的viewcontroller
    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 {
//        if ([rootVC isKindOfClass:[LoginRegistController class]]) { // 模态上来的类|不需要进行下一步不然有时会闪
//            return currentVC;
//        }
        UITabBarController *tabbarVC = ((UITabBarController*)APP_Delegate.window.rootViewController).selectedViewController;
        if (tabbarVC.viewControllers>0) {
            //(获取不到情况下-UITabBarController,UINavigationController)
            //( tabbarVC -获取第一个viewController)
            UIViewController *firstVc = tabbarVC.viewControllers[tabbarVC.viewControllers.count - 1];
            currentVC = firstVc;
        }else{
            // 根视图为非导航类
            currentVC = rootVC;
        }
    }
    return currentVC;
}
方法二
- (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)rootViewController {
    if ([rootViewController isKindOfClass:[UITabBarController class]]) {
        UITabBarController* tabBarController = (UITabBarController*)rootViewController;
        return [self topViewControllerWithRootViewController:tabBarController.selectedViewController];
    } else if (rootViewController.presentedViewController) {
        UIViewController* presentedViewController = rootViewController.presentedViewController;
        return [self topViewControllerWithRootViewController:presentedViewController];
    } else if ([rootViewController isKindOfClass:[UINavigationController class]]) {
        UINavigationController* navigationController = (UINavigationController*)rootViewController;
        return [self topViewControllerWithRootViewController:navigationController.visibleViewController];
    } else {
        return rootViewController;
    }
}

值得注意的是

参考 : https://blog.csdn.net/u010960265/article/details/79731325

上一篇 下一篇

猜你喜欢

热点阅读