美文网首页
iOS获取当前显示的控制器

iOS获取当前显示的控制器

作者: 张囧瑞 | 来源:发表于2017-08-02 17:54 被阅读49次

    在开发中有可能会出现从任何页面跳转到某一个指定页面的需求,比如在使用应用时,突然推送过来一条消息,用户点击了之后就会跳到指定的页面,因为不知道当前用户操作的是哪一个控制器,所以没办法实现跳转。

    首先我们先获取 rootViewController

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

    然后根据不同类型获取不同的控制器,获取当前显示的控制器一共分为三种,UINavigationController、UITabBarViewController、presentedViewController。

    UINavigationController

    UINavigationController中我们可以使用 visibleViewController 这个方法来获得。他会UINavigationController中最上层的控制器。

    @property(nullable, nonatomic,readonly,strong) UIViewController *visibleViewController; // Return modal view controller if it exists. Otherwise the top view controller.
    
    

    UITabBarViewController

    UITabbarViewController中我们可以使用 selectedViewController 来获得选中的控制器。

    @property(nullable, nonatomic, assign) __kindof UIViewController *selectedViewController; // This may return the "More" navigation controller if it exists.
    
    

    presentedViewController

    这个情况下如果有presentedViewController我们就一层层的向上寻找就可以了。

    // The view controller that was presented by this view controller or its nearest ancestor.
    @property(nullable, nonatomic,readonly) UIViewController *presentedViewController  NS_AVAILABLE_IOS(5_0);
    

    整合一下

    最后整合一下就是这样的:

    + (UIViewController *)getShowViewControllerWithRootViewController:(UIViewController *)rootViewController
    {
        if ([rootViewController isKindOfClass:[UINavigationController class]])
        {
            return [Tools getShowViewControllerWithRootViewController:[((UINavigationController *) rootViewController) visibleViewController]];
        }
        else if ([rootViewController isKindOfClass:[UITabBarController class]])
        {
            return [Tools getShowViewControllerWithRootViewController:[((UITabBarController *) rootViewController) selectedViewController]];
        }
        else
        {
            if (rootViewController.presentedViewController)
            {
                return [Tools getShowViewControllerWithRootViewController:rootViewController.presentedViewController];
            }
            else
            {
                return rootViewController;
            }
        }
        
    }
    
    

    相关文章

      网友评论

          本文标题:iOS获取当前显示的控制器

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