iOS獲取屏幕上正在顯示的控制器

開發(fā)項目過程中蚓挤,有需要獲取當(dāng)前正在展示的控制器的需求磺送。本來想用響應(yīng)鏈的思路來實現(xiàn)驻子,發(fā)現(xiàn)會有很多問題。后面發(fā)現(xiàn)可以通過控制器的入棧方式來解決這個問題册着。

1. 控制器入棧方式拴孤,示例代碼如下:

///獲取當(dāng)前活動的控制器
+ (UIViewController *)getCurrentActivityViewController {
    UIWindow *window = [UIApplication sharedApplication].delegate.window;
    NSLog(@"window level: %.0f", window.windowLevel);
    if (window.windowLevel != UIWindowLevelNormal) {
        NSArray *windows = [[UIApplication sharedApplication] windows];
        for (UIWindow * tmpWin in windows) {
            if (tmpWin.windowLevel == UIWindowLevelNormal) {
                window = tmpWin;
                break;
            }
        }
    }
    
    //從根控制器開始查找
    UIViewController *rootVC = window.rootViewController;
    UIViewController *activityVC = nil;
    
    while (true) {
        if ([rootVC isKindOfClass:[UINavigationController class]]) {
            activityVC = [(UINavigationController *)rootVC visibleViewController];
        } else if ([rootVC isKindOfClass:[UITabBarController class]]) {
            activityVC = [(UITabBarController *)rootVC selectedViewController];
        } else if (rootVC.presentedViewController) {
            activityVC = rootVC.presentedViewController;
        } else if ([rootVC isKindOfClass:[RTContainerController class]]) {
            activityVC = [(RTContainerController *)rootVC contentViewController];
        } else {
            break;
        }
        
        rootVC = activityVC;
    }
    
    return activityVC;
}

上面的代碼中的RTContainerController是我們項目中用到的 RTRootNavigationController 框架,如果項目中沒有用到的可以把上面對應(yīng)判斷項去掉甲捏。

2. 響應(yīng)鏈的方式(有問題演熟,思路可以參考)

/// 獲取當(dāng)前活動的控制器
+ (UIViewController *)getCurrentActivityViewController {
    UIViewController *result = nil;
    
    UIWindow *window = [UIApplication sharedApplication].delegate.window;
    NSLog(@"window level: %.0f", window.windowLevel);
    if (window.windowLevel != UIWindowLevelNormal) {
        NSArray *windows = [[UIApplication sharedApplication] windows];
        for (UIWindow * tmpWin in windows) {
            if (tmpWin.windowLevel == UIWindowLevelNormal) {
                window = tmpWin;
                break;
            }
        }
    }
    
    //通過響應(yīng)鏈來找到當(dāng)前View的控制器
    UIView *rootVCView = window.rootViewController.view;
    UIView *lastView = [self getLastSubviewsWithView:rootVCView];
    NSLog(@"lastView = %@", lastView);
    id nextResponder = [lastView nextResponder];
    while (nextResponder) {
        if ([nextResponder isKindOfClass:[UIViewController class]]) {
            break;
        } else if ([nextResponder isKindOfClass:[UIView class]]) {
            nextResponder = [nextResponder nextResponder];
        } else if ([nextResponder isKindOfClass:[UIApplication class]]) {
            nextResponder = nil;
            break;
        }
    }
    
    if (nextResponder != nil) {
        result = nextResponder;
    } else {
        result = window.rootViewController;
    }
    
    NSLog(@"當(dāng)前最前面的活動的控制器是: %@", result);
    return result;
}

/// 獲取View的最底層子View
+ (UIView *)getLastSubviewsWithView:(UIView *)view {
    UIView *lastView = view;
    NSMutableString *viewString = [NSMutableString string];
    while (lastView.subviews.count != 0) {
        [viewString appendFormat:@"%@=>", NSStringFromClass(lastView.class)];
        lastView = lastView.subviews.lastObject;
    }
    [viewString appendFormat:@"%@", NSStringFromClass(lastView.class)];
    NSLog(@"查找最底層的View的過程是: %@", viewString);
    return lastView;
}

3. 參考

iOS 獲得屏幕正在顯示的Controller(自定義的控制器)的實用方法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市司顿,隨后出現(xiàn)的幾起案子芒粹,更是在濱河造成了極大的恐慌,老刑警劉巖大溜,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件化漆,死亡現(xiàn)場離奇詭異,居然都是意外死亡钦奋,警方通過查閱死者的電腦和手機(jī)座云,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來付材,“玉大人朦拖,你說我怎么就攤上這事⊙嵯危” “怎么了璧帝?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長富寿。 經(jīng)常有香客問我睬隶,道長,這世上最難降的妖魔是什么页徐? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任苏潜,我火速辦了婚禮,結(jié)果婚禮上泞坦,老公的妹妹穿的比我還像新娘窖贤。我一直安慰自己,他們只是感情好贰锁,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布赃梧。 她就那樣靜靜地躺著,像睡著了一般豌熄。 火紅的嫁衣襯著肌膚如雪授嘀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天锣险,我揣著相機(jī)與錄音蹄皱,去河邊找鬼览闰。 笑死,一個胖子當(dāng)著我的面吹牛巷折,可吹牛的內(nèi)容都是我干的压鉴。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼锻拘,長吁一口氣:“原來是場噩夢啊……” “哼油吭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起署拟,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤婉宰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后推穷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體心包,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年馒铃,在試婚紗的時候發(fā)現(xiàn)自己被綠了蟹腾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡区宇,死狀恐怖岭佳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情萧锉,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布述寡,位于F島的核電站柿隙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鲫凶。R本人自食惡果不足惜禀崖,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望螟炫。 院中可真熱鬧波附,春花似錦、人聲如沸昼钻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽然评。三九已至仅财,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碗淌,已是汗流浹背盏求。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工抖锥, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碎罚。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓磅废,卻偏偏與公主長得像,于是被迫代替她去往敵國和親荆烈。 傳聞我的和親對象是個殘疾皇子拯勉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,969評論 3 119
  • 今天耙考,我載外婆出去買東西谜喊。在要到紅綠燈的時候,我看到前面有交警在查沒戴頭盔的倦始,心里暗想了一下斗遏,辛虧我有戴啊。然后鞋邑,...
    芯語_閱讀 91評論 0 0
  • 文/樹 我和室友的關(guān)系一直以來處得不好枚碗,很尷尬的感覺逾一,但今天,我給她們說了一個很重要的秘密肮雨,不是為了博得她們的好感...
    自來卷的小尚閱讀 351評論 2 0
  • 1.早上醒來第一件事就是拿起手機(jī)遵堵,看你給我發(fā)的消息。好像是每天都一樣的“起床了”“快起床”或者是隨便的小表情怨规,但也...
    淺半夏閱讀 378評論 1 1
  • 8月12日 六 我以前老是調(diào)皮搗蛋陌宿,不懂得珍惜父母對我的愛。但是媽媽今天讓我聽了父親這首歌波丰,我的心久久不...
    寶貝真棒閱讀 138評論 0 0