美文网首页iOS开发经验与技巧
iOS AppDelegate实现跳转ViewControlle

iOS AppDelegate实现跳转ViewControlle

作者: 1b3bd36d9d21 | 来源:发表于2017-07-23 10:22 被阅读41次

    也是在项目中遇到这样的需求,就是接收到远程推送通知时,如何调转到相应的通知页面。

    直接上代码吧,比较简单,就是获取根控制器,然后Push就可以了

    主要是如何的AppDelegate中获取根控制器,下面就提供两种方法,都是获取根控制器的

    实现方法
    就是在获取到最顶层控制器`[self topViewController]` ,直接
    [vc.navigationController pushViewController:nextVC animated:YES];
    
    代码一
    /// 获取最顶层控制器
    - (UIViewController *)topViewController {
        UIViewController *resultVC;
        resultVC = [self _topViewController:[[UIApplication sharedApplication].keyWindow rootViewController]];
        while (resultVC.presentedViewController) {
            resultVC = [self _topViewController:resultVC.presentedViewController];
        }
        return resultVC;
    }
    
    - (UIViewController *)_topViewController:(UIViewController *)vc {
        if ([vc isKindOfClass:[UINavigationController class]]) {
            return [self _topViewController:[(UINavigationController *)vc topViewController]];
        } else if ([vc isKindOfClass:[UITabBarController class]]) {
            return [self _topViewController:[(UITabBarController *)vc selectedViewController]];
        } else {
            return vc;
        }
        return nil;
    }
    
    
    代码二
    - (UIViewController *) topViewController {
        UIViewController *result = nil;
        UIWindow * window = [[UIApplication sharedApplication] keyWindow];
        //app默认windowLevel是UIWindowLevelNormal,如果不是,找到UIWindowLevelNormal的
        if (window.windowLevel != UIWindowLevelNormal)
        {
            NSArray *windows = [[UIApplication sharedApplication] windows];
            for(UIWindow * tmpWin in windows)
            {
                if (tmpWin.windowLevel == UIWindowLevelNormal)
                {
                    window = tmpWin;
                    break;
                }
            }
        }
        id  nextResponder = nil;
        UIViewController *appRootVC = window.rootViewController;
        //    如果是present上来的appRootVC.presentedViewController 不为nil
        if (appRootVC.presentedViewController) {
            nextResponder = appRootVC.presentedViewController;
        }else{
            UIView *frontView = [[window subviews] objectAtIndex:0];
            nextResponder = [frontView nextResponder];  
        }
        
        if ([nextResponder isKindOfClass:[UITabBarController class]]){
            UITabBarController * tabbar = (UITabBarController *)nextResponder;
            UINavigationController * nav = (UINavigationController *)tabbar.viewControllers[tabbar.selectedIndex];
            //        UINavigationController * nav = tabbar.selectedViewController ; 上下两种写法都行
            result = nav.childViewControllers.lastObject;
            
        }else if ([nextResponder isKindOfClass:[UINavigationController class]]){
            UIViewController * nav = (UIViewController *)nextResponder;
            result = nav.childViewControllers.lastObject;
        }else{
            result = nextResponder;
        }
        
        return result;
    }
    

    相关文章

      网友评论

        本文标题:iOS AppDelegate实现跳转ViewControlle

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