iOS获取当前显示的控制器

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

首先我们先获取 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获取当前显示的控制器)