iOS获取当前显示的控制器

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

首先我们先获取 rootViewController

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

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

UINavigationController

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

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

UITabBarViewController

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

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

presentedViewController

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

1
2
// 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);

整合一下

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
+ (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;
}
}
}