美文网首页iOS菜鸟联盟UI基础
iOS 获取当前window显示的控制器并返回到首页。

iOS 获取当前window显示的控制器并返回到首页。

作者: 走向菜鸟的菜鸟 | 来源:发表于2018-03-01 11:38 被阅读1305次
    温馨提示:具体情况还要具体分析,本篇文章处理跳转逻辑不一定符合您的项目,请分析后进行修改使用。

    思路:
    将这个需求划分成两部分进行处理:
    1️⃣获取当前window显示的控制器。
    2️⃣从当前控制器返回到首页。

    第一步:获取当前window显示的控制器

    //获取当前屏幕显示的viewcontroller
    + (UIViewController *)getCurrentVC {
        
        UIViewController *result = nil;
        
        UIViewController *rootVC = [UIApplication sharedApplication].keyWindow.rootViewController;
        
        do {
            if ([rootVC isKindOfClass:[UINavigationController class]]) {
                UINavigationController *navi = (UINavigationController *)rootVC;
                UIViewController *vc = [navi.viewControllers lastObject];
                result = vc;
                rootVC = vc.presentedViewController;
                continue;
            } else if([rootVC isKindOfClass:[UITabBarController class]]) {
                UITabBarController *tab = (UITabBarController *)rootVC;
                result = tab;
                rootVC = [tab.viewControllers objectAtIndex:tab.selectedIndex];
                continue;
            } else if([rootVC isKindOfClass:[UIViewController class]]) {
                result = rootVC;
                rootVC = nil;
            }
        } while (rootVC != nil);
        
        return result;
    }
    

    第二步:判断当前window显示的控制器的跳转方式(Push or Modal)
    ①:判断currentVC.presentingViewController是否存在?

    • 如果存在,则说明是通过Modal方式跳转过来的(先dismiss,再pop)
    如果是单个控制器Modal(A跳转B,B返回A),使用
    [self dismissViewControllerAnimated:YES completion:nil];  
    
    如果是多个控制器Modal(A跳转B,B跳转C,C返回A),使用
    UIViewController *rootVC = self.presentingViewController;
    while (rootVC.presentingViewController) {
         rootVC = rootVC.presentingViewController;
    }
    [rootVC dismissViewControllerAnimated:YES completion:nil];
    
    • 如果不存在,则说明是通过Push方式跳转过来的(直接pop)
    使用 [currentVC.navigationController popToRootViewControllerAnimated:YES]; 
    

    ②:根据①的判断进行跳转的逻辑处理
    注意:如果是基于tabBarController的控制器currentVC.presentingViewController获取的控制器类型UITabBarController,相关解释请查看这篇文章

    + (void)chooseToJumpHome {
        UIViewController *currentVC = [self getCurrentVC];
        if (currentVC.presentingViewController) {
           [currentVC dismissViewControllerAnimated:NO completion:^{
                // 此处为注意点,处理当前界面是先push再modal出来而显示的控制器(处理方式:先dismiss,再pop)如果获取的currentVC.presentingViewController是UITabBarController,则无法进行pop操作了。
                if ([currentVC.presentingViewController isKindOfClass:[UINavigationController class]]) {
                    UINavigationController *navi = (UINavigationController *)currentVC.presentingViewController;
                    [navi popToRootViewControllerAnimated:NO];
                }
            }];
        } else {
            [currentVC.navigationController popToRootViewControllerAnimated:NO];
        }
        
        UITabBarController *rootTab = (UITabBarController *)[UIApplication sharedApplication].keyWindow.rootViewController;
        rootTab.selectedIndex = 0;
    }
    

    相关文章

      网友评论

        本文标题:iOS 获取当前window显示的控制器并返回到首页。

        本文链接:https://www.haomeiwen.com/subject/ncqgxftx.html