获取当前ViewController

本文介绍了一种在iOS应用中获取当前显示的UIViewController的方法,特别适用于从后台返回前台的情况。该方法考虑了不同类型的视图控制器(如UITabBarController, UINavigationController等)的嵌套层级。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

获取当前所在viewController适用于后台进入前台情况



#pragma mark - 得到当前所在viewController

-(UIViewController *)currentViewController

{

    UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;

    // modal展现方式的底层视图不同

    // 取到第一层时,取到的是UITransitionView,通过这个view拿不到控制器

    UIView *firstView = [keyWindow.subviews firstObject];

    UIView *secondView = [firstView.subviews firstObject];

    UIViewController *vc = [self getCurrentViewControllerByView:secondView];

    if ([vc isKindOfClass:[UITabBarController class]]) {

        UITabBarController *tab = (UITabBarController *)vc;

        if ([tab.selectedViewController isKindOfClass:[UINavigationController class]]) {

            UINavigationController *nav = (UINavigationController *)tab.selectedViewController;

            return [nav.viewControllers lastObject];

        } else {

            return tab.selectedViewController;

        }

    } else if ([vc isKindOfClass:[UINavigationController class]]) {

        UINavigationController *nav = (UINavigationController *)vc;

        return [nav.viewControllers lastObject];

    } else if([vc isKindOfClass:[MMDrawerController class]]){

        MMDrawerController *mmDrawer = (MMDrawerController*)vc;

        if ([mmDrawer.centerViewController isKindOfClass:[UINavigationController class]]) {

            UINavigationController *navC = (UINavigationController *)mmDrawer.centerViewController;

            return [navC.viewControllers lastObject];

        }else {

            UITabBarController *tabBar = (UITabBarController*)mmDrawer.centerViewController;

            UINavigationController *navC = (UINavigationController *)tabBar.selectedViewController;

            return [navC.viewControllers lastObject];

        }

    }else{

        return vc;

    }

    return nil;

}

#pragma mark - 根据view得到当前viewController

-(UIViewController *)getCurrentViewControllerByView:(UIView*)view{

    UIResponder *next = [view nextResponder];

    do {

        if ([next isKindOfClass:[UIViewController class]]) {

            return (UIViewController *)next;

        }

        next = [next nextResponder];

    } while (next != nil);

    return nil;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值