美文网首页
获得当前屏幕所显示的视图控制器

获得当前屏幕所显示的视图控制器

作者: yycache | 来源:发表于2019-08-19 22:28 被阅读0次

    在无论任何环境下,没有任何参数,我都要获得当前屏幕所显示的视图控制器

    oc

    +(UIViewController *)getCurrentVC

    {

        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{

            NSLog(@"===%@",[window subviews]);

            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;

    }

    swift

        // 找到当前显示的window

        private func getCurrentWindow() -> UIWindow? {

            // 找到当前显示的UIWindow

            var window: UIWindow? = UIApplication.shared.keyWindow

            /**

            window有一个属性:windowLevel

            当 windowLevel == UIWindowLevelNormal 的时候,表示这个window是当前屏幕正在显示的window

            */

            if window?.windowLevel != UIWindow.Level.normal {

                for tempWindow in UIApplication.shared.windows {

                    if tempWindow.windowLevel == UIWindow.Level.normal {

                        window = tempWindow

                        break

                        }

                    }

                }

            return window

        }

        /* 递归找最上面的viewController */

        func getCurrentVC() -> UIViewController? {

            return self.topViewControllerWithRootViewController(viewController: self.getCurrentWindow()?.rootViewController)

        }

        private func topViewControllerWithRootViewController(viewController :UIViewController?) -> UIViewController? {

            if viewController == nil {

                return nil

            }

            if viewController?.presentedViewController != nil {

                return self.topViewControllerWithRootViewController(viewController: viewController?.presentedViewController!)

            }

            else if viewController?.isKind(of: UITabBarController.self) == true {

                return self.topViewControllerWithRootViewController(viewController: (viewController as! UITabBarController).selectedViewController)

            }

            else if viewController?.isKind(of: UINavigationController.self) == true {

                return self.topViewControllerWithRootViewController(viewController: (viewController as! UINavigationController).visibleViewController)

            }

            else {

                return viewController

            }

        }

    通过view获取vc

        /** 通过当前view, 获取栈底controller */

        func pgg_ViewController() -> (UIViewController) {

            //1.通过响应者链关系,取得此视图的下一个响应者

            var next:UIResponder?

            next = self.next!

            repeat {

                //2.判断响应者对象是否是视图控制器类型

                if ((next as?UIViewController) != nil) {

                    return (next as! UIViewController)

                }else {

                    next = next?.next

                }

            } while next != nil

            return UIViewController()

        }

    获取当前视图所在导航控制器

    ///获取当前视图所在导航控制器

    func currentNavViewController() -> UINavigationController? {

        var n = next

        while n != nil {

            if n is UINavigationController {

                return n as? UINavigationController

            }

            n = n?.next

        }

        return nil

    }

    +(UIViewController *)getCurrentVC

    {

        UIViewController* vc = [UIApplication sharedApplication].keyWindow.rootViewController;

            while (1) {

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

                    vc = ((UITabBarController*)vc).selectedViewController;

                }

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

                    vc = ((UINavigationController*)vc).visibleViewController;

                }

                if (vc.presentedViewController) {

                    vc = vc.presentedViewController;

                }else{

                    break;

                }

            }

        return vc;

    }

    相关文章

      网友评论

          本文标题:获得当前屏幕所显示的视图控制器

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