簡體   English   中英

如何在iOS中找到當前可見的ViewController

[英]How to find current visible viewController in iOS

我們知道,如果您的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

找到當前的頂視圖控制器,我用這種方法

- (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;
}
-(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;
}

如果要顯示該類的下一個屏幕,則無需從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] ;

此代碼還檢查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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM