iOS获取屏幕正在显示ViewController的最优雅方式

相信大家做iOS项目应该都会有同样需求,需要一个通用方法获取屏幕当前正在显示的ViewController,比如说,我之前封装一个分享的框架,需要知道当前屏幕显示VC跳转到系统短信界面,如果直接传入当前VC可以满足这个需求,但作为一个通用框架,如果不需要外界传递能够直接获取,感觉代码会优雅很多。

1.获取RootViewController

下面是Apple官方文档说明

The root view controller provides the content view of the window. Assigning a view controller to this property (either programmatically or using Interface Builder) installs the view controller’s view as the content view of the window. If the window has an existing view hierarchy, the old views are removed before the new ones are installed.

rootViewController的设定通常会在设置keyWindow的时候遇到, 表示该UIWindow的最底层的UIViewController

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

2.获取currentViewController

无论项目RootViewController是UIViewController、UINavigationController或者UITabBarController,无论当前页面经过多少次Push或者Present出来,下面方法都可以准确获取

while (rootVC.presentedViewController) {
    rootVC = rootVC.presentedViewController;
    if ([rootVC isKindOfClass:[UITabBarController class]]) {
        rootVC = ((UITabBarController *)rootVC).selectedViewController;
    } else if ([rootVC isKindOfClass:[UINavigationController class]]){
        rootVC = ((UINavigationController *)rootVC).visibleViewController;
    }
}
if ([rootVC isKindOfClass:[UITabBarController class]]) {
    rootVC = ((UITabBarController *)rootVC).selectedViewController;
} else if ([rootVC isKindOfClass:[UINavigationController class]]){
    rootVC = ((UINavigationController *)rootVC).visibleViewController;
}
return rootVC;

如果大家有更好的获取当前VC方式,欢迎提出,谢谢!

推荐阅读更多精彩内容

  • 更好的阅读体验,请到个人博客阅读: iOS中的系统转场 请忽略标题,😂,本文记录的是对下图所示的Kind, Pre...
    CaryaLiu阅读 920评论 0 0
  • /* UIViewController is a generic controller base class th...
    DanDanC阅读 696评论 0 1
  • 1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现cl...
    江湖人称_赫大侠阅读 895评论 2 37
  • ViewsBecause view objects are the main way your applicati...
    梁光飞阅读 61评论 0 0
  • q桑和y小姐在车站前做了个最后的拥抱,q桑知道y小姐三秒后眼泪就要落下,于是他先于这之前转身离开,他怕自己也会丢脸...
    Numbmo阅读 162评论 0 1