如何在 iOS 中找到当前可见的 viewController

Posted

技术标签:

【中文标题】如何在 iOS 中找到当前可见的 viewController【英文标题】:How to find current visible viewController in iOS 【发布时间】: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

【问题讨论】:

【参考方案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;

【讨论】:

以上是关于如何在 iOS 中找到当前可见的 viewController的主要内容,如果未能解决你的问题,请参考以下文章

iOS:如何获取当前可见的键盘类型?

禁用 UITextView 中的滚动,同时避免在 ios 的当前位置弹跳到顶部和文本不可见

IOS swift我可以从TableViewCell中获取当前可见视图吗

IOS按需返回刷新数据

在IOS核心音频中,如何找到文件播放器音频单元的真实当前播放头位置?

facebook pixel:PageView与ViewContent