【问题标题】:How to find current visible viewController in iOS如何在 iOS 中找到当前可见的 viewController
【发布时间】:2016-10-25 08:24:18
【问题描述】:

我们知道,如果你的 viewController 已经包含 UINavigationController ,

你可以通过'self.navigationController.visibleViewController'找到你当前的可见视图控制器。

但是我给你一个视图控制器,如何找到当前可见的控制器?

例如:

code one :
------
AVClr *avclr = [[AVClr alloc]init] ;
AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate ;
appDelegate.window.rootViewController = avclr ;
[avclr presentViewController:loginNavClr animated:YES completion:nil] ;

---> 现在,显示avclr

code two:
------
AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate ;
UIViewController *currentVisibleViewController = appDelegate.window.rootViewController ;
BVClr *bvclr = [[BVClr alloc]init] ;
[currentVisibleViewController presentViewController:bvclr animated:YES completion:nil] ;

--->现在,显示bvclr

code three:
------
AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate ;
UIViewController *currentVisibleViewController = appDelegate.window.rootViewController ;
CVClr *cvclr = [[CVClr alloc]init] ;
[currentVisibleViewController presentViewController:cvclr animated:YES completion:nil] ;

--->错误,无法显示cvclr,因为avclr是rootViewController,而avclr存在bvclr,所以显示bvclr

问题:

但是我们知道,在另一个 .m 文件中编码三个,所以我们不知道 rootViewController 是谁。所以如果我提出cvclr,结果出乎意料!

在这种情况下,如何显示cvclr

【问题讨论】:

    标签: ios presentviewcontroller


    【解决方案1】:
    -(UIViewController *)getVisibleViewController : (UIViewController *)rootViewController
    {
        UIViewController *rootVC = rootViewController;
        if (rootVC == nil)
        {
            rootVC = [[[UIApplication sharedApplication] keyWindow] rootViewController];
        }
    
        if ([rootVC presentedViewController] == nil)
        {
            return rootVC;
        }
    
        if ([rootVC presentedViewController] != nil)
        {
            if ([[rootVC presentedViewController] isKindOfClass:UINavigationController.self]) {
                UINavigationController *navigationController = (UINavigationController *)[rootVC presentedViewController];
                return [[navigationController viewControllers] lastObject];
            }
            return [self getVisibleViewController : [rootVC presentedViewController]];
        }
        return nil;
    }
    

    【讨论】:

    • 有帮助吗?我没有测试过,只是在这里写了代码。如果某些语法错误,请纠正。但你会得到基本的想法。。
    【解决方案2】:

    为了找到当前的顶视图控制器,我使用了这个方法

    - (UIViewController *)currentTopViewController
    {
       UIViewController *topVC = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
       while (topVC.presentedViewController)
       {
         topVC = topVC.presentedViewController;
       }
       if ([topVC isKindOfClass:[UINavigationController class]]) {
          return [(UINavigationController *)topVC topViewController];
       }
      return topVC;
    }
    

    【讨论】:

      【解决方案3】:

      如果您正在展示该课程的下一个屏幕,那么您不需要从 UIWindow 获取顶视图控制器 只需使用这个..

       -----------------
      AVClr *avclr = [[AVClr alloc]init];
      [self presentViewController: avclr animated:YES completion:nil] ;
      
      ------------------------------
      
      
      BVClr *bvclr = [[BVClr alloc]init] ;
      [self.presentingViewControler presentViewController:bvclr animated:YES completion:nil] ;
      
      ------------------
      
      
      CVClr *cvclr = [[CVClr alloc]init] ;
      [self.presentingViewControler presentViewController:cvclr animated:YES completion:nil] ;
      

      【讨论】:

        【解决方案4】:

        此代码还检查UITabbarViewContoller

        -(UIViewController *) getVisibleViewContoller {
            UIViewController *rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController;
            if (!rootViewController) {
                return nil;
            }
            if ([rootViewController isKindOfClass:[UITabBarController class]]) {
                UITabBarController *tabbarVC = (UITabBarController *) rootViewController;
                UIViewController *selectedVC = tabbarVC.selectedViewController;
                if (selectedVC) {
                    if (![selectedVC isKindOfClass:[UINavigationController class]]) {
                        return selectedVC;
                    }
                    rootViewController = selectedVC;
                }
            }
            if ([rootViewController isKindOfClass:[UINavigationController class]]) {
                UINavigationController *navigationVC = (UINavigationController *) rootViewController;
                if (navigationVC.topViewController) {
                    return navigationVC.topViewController;
                }
                return navigationVC.viewControllers.lastObject;
            }
            return rootViewController;
        }
        

        【讨论】:

          猜你喜欢
          • 2022-08-06
          • 1970-01-01
          • 2013-09-14
          • 2013-06-08
          • 1970-01-01
          • 2016-01-19
          • 2011-03-19
          • 1970-01-01
          • 2016-03-28
          相关资源
          最近更新 更多