iOS开发获取当前控制器

iOS项目开发中,经常会遇到需要知道应用正在显示哪个控制器的情况。比如,当收到一条推送通知时,要根据不同界面处理不同的业务逻辑,就需要知道收到通知时应用正处于哪个界面,即获取到应用正在显示的控制器。下面介绍一种方法,分别用swift和OC实现。

swift版:

func getCurrentVC() -> UIViewController? {
    for window in UIApplication.shared.windows.reversed() {
        var tempView: UIView? = window.subviews.last
        for subview in window.subviews.reversed() {
            if subview.classForCoder == NSClassFromString("UILayoutContainerView") {
                tempView = subview
                break
            }
        }
        
        var nextResponder = tempView?.next
        
        var next: Bool {
            return !(nextResponder is UIViewController) || nextResponder is UINavigationController || nextResponder is UITabBarController || nextResponder?.classForCoder == NSClassFromString("UIInputWindowController")
        }
        
        while next{
            tempView = tempView?.subviews.first
            if tempView == nil {
                return nil
            }
            nextResponder = tempView!.next
        }
        if let currentVC = nextResponder as? UIViewController {
            return currentVC
        }
    }
    return nil
}


OC版:

-  (UIViewController *)getCurrentVC {
     for (UIWindow *window in [UIApplication sharedApplication].windows.reverseObjectEnumerator) {
        
        UIView *tempView = window.subviews.lastObject;
        
        for (UIView *subview in window.subviews.reverseObjectEnumerator) {
            if ([subview isKindOfClass:NSClassFromString(@"UILayoutContainerView")]) {
                tempView = subview;
                break;
            }
        }
        
        BOOL(^canNext)(UIResponder *) = ^(UIResponder *responder){
            if (![responder isKindOfClass:[UIViewController class]]) {
                return YES;
            } else if ([responder isKindOfClass:[UINavigationController class]]) {
                return YES;
            } else if ([responder isKindOfClass:[UITabBarController class]]) {
                return YES;
            } else if ([responder isKindOfClass:NSClassFromString(@"UIInputWindowController")]) {
                return YES;
            }
            return NO;
        };
        
        UIResponder *nextResponder = tempView.nextResponder;
        
        while (canNext(nextResponder)) {
            tempView = tempView.subviews.firstObject;
            if (!tempView) {
                return nil;
            }
            nextResponder = tempView.nextResponder;
        }
        
        UIViewController *currentVC = (UIViewController *)nextResponder;
        if (currentVC) {
            return currentVC;
        }
    }
    return nil;

}

使用该方法的需要注意的地方是,需要等到控制器viewDidAppear之后才能获取到正确的控制器

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文参加# 印象青农,萌有感受#活动,本文承诺,文章内容为原创,且未在其他平台发表过。 转眼间进入大...
    灬灬灬灬火阅读 297评论 0 0
  • 2016年8月2日 雨 台风过境 却从邻市擦肩而过 今天台风“妮妲”登陆,本以为可以亲眼见识一下的,结果却从深圳而...
    Samhanx阅读 180评论 0 0
  • 今天参加拓展 感悟挺多的 第一次参加这么有趣的拓展 有真人CS,有巨人脚,有指压板跳大绳,瞬间迁移,套呼啦圈,还有...
    人不能偷懒阅读 186评论 0 0
  • 黑夜给了我黑色的眼睛,我却用它寻找光明 白昼来了,我却只看见了虚伪
    参差00阅读 174评论 0 1
  • 羡慕有钱人家的女生 可以不用奋斗 却还可以那么幸福 什么也不用做就比我们这些什么都做了的人好一万倍 可以整天在家当...
    简单就好T_T阅读 280评论 0 1