美文网首页
利用visibleViewController和topViewC

利用visibleViewController和topViewC

作者: 迷失的信徒 | 来源:发表于2020-08-13 14:28 被阅读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;
    }
}

值得注意的是

  • [[[UIApplication sharedApplication] keyWindow] rootViewController]有时为nil 比如当页面有菊花在转的时候,这个rootViewController就为nil;
  • 所以使用[[[[UIApplication sharedApplication] delegate] window] rootViewController]
    或者[[[[UIApplication sharedApplication] windows] objectAtIndex:0] rootViewController];
  • presentedViewControllerpresentingViewController
    当A弹出B
    A.presentedViewController=B
    B.presentingViewController=A

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

相关文章

网友评论

      本文标题:利用visibleViewController和topViewC

      本文链接:https://www.haomeiwen.com/subject/fmcfdktx.html