iOS:關(guān)于獲取當(dāng)前控制器的方法

在做項(xiàng)目時,有時候,會寫一個工具類來對項(xiàng)目進(jìn)行操作:
這個時候如果需要使用當(dāng)前控制器去進(jìn)行一些操作,比如想去present一個alertController,
這時候就需要獲取到當(dāng)前控制器了,下面就是獲取的方法:根據(jù)每個App都是一個單例來獲取當(dāng)前窗口的根控制器,從而獲取到所有的控制器,找到

+ (UIViewController *)getCurrentVC {
    
    UIWindow *window = [[UIApplication sharedApplication].windows firstObject];
    if (!window) {
        return nil;
    }
    UIView *tempView;
    for (UIView *subview in window.subviews) {
        if ([[subview.classForCoder description] isEqualToString:@"UILayoutContainerView"]) {
            tempView = subview;
            break;
        }
    }
    if (!tempView) {
        tempView = [window.subviews lastObject];
    }
    
    id nextResponder = [tempView nextResponder];
    while (![nextResponder isKindOfClass:[UIViewController class]] || [nextResponder isKindOfClass:[UINavigationController class]] || [nextResponder isKindOfClass:[UITabBarController class]]) {
        tempView =  [tempView.subviews firstObject];
        
        if (!tempView) {
            return nil;
        }
        nextResponder = [tempView nextResponder];
    }
    return  (UIViewController *)nextResponder;
}

swift寫法

class dynamic func getCurrentController() -> UIViewController? {
        
        guard let window = UIApplication.shared.windows.first else {
            return nil
        }
        
        var tempView: UIView?
        
        for subview in window.subviews.reversed() {
            
            
            if subview.classForCoder.description() == "UILayoutContainerView" {
                
                tempView = subview
                
                break
            }
        }
        
        if tempView == nil {
            
            tempView = window.subviews.last
        }
        
        var nextResponder = tempView?.next
        
        var next: Bool {
            return !(nextResponder is UIViewController) || nextResponder is UINavigationController || nextResponder is UITabBarController
        }
        
        while next{
            
            tempView = tempView?.subviews.first
            
            if tempView == nil {
                
                return nil
            }
            
            nextResponder = tempView!.next
        }
        
        return nextResponder as? UIViewController
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 看一下這個好不好
    戀陽閱讀 72評論 0 0
  • 行歌途中有一棵早春的樹開在理想的三旬,我躲在濃煙下的霓虹深處看你的來信,卻不知你只是經(jīng)過。 初遇,是《理想...
    最喜二陳閱讀 702評論 0 0
  • 讀書一定要認(rèn)真點(diǎn),對自己狠一點(diǎn)才可以 文 櫻小落 關(guān)于讀書,很多人都描述過那么多唯美而富有哲理的句子,我覺得我真...
    櫻小落閱讀 681評論 0 1
  • 這篇文章送給父母,我早應(yīng)該給他們寫一些東西了,但是總覺得敲下父母這兩個字,有一種莫名的厚重感,這份感覺我無法駕馭,...
    王子豫啊閱讀 692評論 0 1
  • 夢里水鄉(xiāng), 小橋流水, 雞鳴走犬, 黑瓦白墻, 綠水青山。 行人緩緩, 視若不見, 我在橋的這一頭, 你在橋的那一...
    孤獨(dú)風(fēng)閱讀 264評論 0 2

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