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