iOS小技能: 获取当前正在显示的控制器

1,982 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

应用场景 :横屏电子签名、更新界面信息

例子:iOS 程序进入前台 (即切换应用至当前应用的时候)主动刷新一次收款信息

I、应用案例

1.1 横屏电子签名

1.2 更新界面信息(请求接口,更新模型数据)

UpdateAppCollectionInfo

/**
 2、切换应用至当前app的时候,收款信息界面,主动刷新一次
 */
+ (void)UpdateAppCollectionInfo{
    
    UIViewController *rootViewController =UIApplication.sharedApplication.delegate.window.rootViewController;
    
//NSStringFromClass
    
    if(![NSStringFromClass(rootViewController.class) isEqualToString:@"HWTabBarController"] ){
        

//    if(![rootViewController isKindOfClass:HWTabBarController.class] ){
        return ;
        
        
        
    }
    
    HWTabBarController *tmpTabVC = rootViewController;
    
    UIViewController *tmpTabVCselectedViewController = tmpTabVC.selectedViewController;
    
    
    if(![tmpTabVCselectedViewController isKindOfClass:HWNavigationController.class] ){
        return ;
        
        
        
    
    }
    
    HWNavigationController *nav = tmpTabVCselectedViewController;

    if(![ @"QCTCollectionInformationViewController" isEqualToString: NSStringFromClass(nav.visibleViewController.class)]){
        
        return;
    }

    
    // 更新数据
    
    [nav.visibleViewController performSelector:@selector(setupAppCollectionInfo)];
    

}

II、知识储备

  • 程序进入前台:applicationDidBecomeActive
  • 导航栏正在显示的子控制器:nav.visibleViewController
  • TabVC 选中的控制器:selectedViewController

2.1 监听程序进入前台

程序进入前台:applicationDidBecomeActive

#pragma mark - 程序进入前台 切换应用至当前应用的收款信息界面,主动刷新一次收款信息
- (void)applicationDidBecomeActive:(UIApplication *)application {
    [UIApplication sharedApplication].applicationIconBadgeNumber = 0;
    [JPUSHService setBadge:0];

    
    //

    
    [ QCTCollectionInformationViewController UpdateAppCollectionInfo];

    
        
}

2.2 从UIStoryboard获取VC

  • 通过方法instantiateInitialViewController初始化storyboard的ViewController

  • 根据instantiateViewControllerWithIdentifier 从从UIStoryboard获取VC对象

    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"SKUViewController" bundle:nil];

    SKUViewController *VC = [mainStoryboard instantiateViewControllerWithIdentifier:@"SKUViewController"];
    

在这里插入图片描述

2.3 获取当前VC

getCurrentVC

// 获取当前VC
+ (UIViewController *)getCurrentVC
{
    UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
    
    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 {
        // 根视图为非导航类
        currentVC = rootVC;
    }
    return currentVC;
}

III、see also

更多内容请关注#小程序:iOS逆向,只为你呈现有价值的信息,专注于移动端技术研究领域。