iOS開發(fā)獲取當(dāng)前控制器

iOS項(xiàng)目開發(fā)中,經(jīng)常會遇到需要知道應(yīng)用正在顯示哪個控制器的情況。比如,當(dāng)收到一條推送通知時(shí),要根據(jù)不同界面處理不同的業(yè)務(wù)邏輯,就需要知道收到通知時(shí)應(yīng)用正處于哪個界面,即獲取到應(yīng)用正在顯示的控制器。下面介紹一種方法,分別用swift和OC實(shí)現(xiàn)。

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之后才能獲取到正確的控制器

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文參加# 印象青農(nóng),萌有感受#活動,本文承諾,文章內(nèi)容為原創(chuàng),且未在其他平臺發(fā)表過。 轉(zhuǎn)眼間進(jìn)入大...
    灬灬灬灬火閱讀 353評論 0 0
  • 2016年8月2日 雨 臺風(fēng)過境 卻從鄰市擦肩而過 今天臺風(fēng)“妮妲”登陸,本以為可以親眼見識一下的,結(jié)果卻從深圳而...
    Samhanx閱讀 202評論 0 0
  • 今天參加拓展 感悟挺多的 第一次參加這么有趣的拓展 有真人CS,有巨人腳,有指壓板跳大繩,瞬間遷移,套呼啦圈,還有...
    人不能偷懶閱讀 207評論 0 0
  • 黑夜給了我黑色的眼睛,我卻用它尋找光明 白晝來了,我卻只看見了虛偽
    參差00閱讀 188評論 0 1
  • 羨慕有錢人家的女生 可以不用奮斗 卻還可以那么幸福 什么也不用做就比我們這些什么都做了的人好一萬倍 可以整天在家當(dāng)...
    簡單就好T_T閱讀 287評論 0 1

友情鏈接更多精彩內(nèi)容