iOS 獲取當(dāng)前的ViewController的方法
本文介紹了iOS 獲取當(dāng)前的ViewController,分享給大家。具體如下
通過(guò)簡(jiǎn)單的判斷[UIViewController class],就認(rèn)定它是想要的控制器是不對(duì)的:
if ([nextResponder isKindOfClass:[UIViewController class]]) { result = nextResponder; }else { result = window.rootViewController; }
因?yàn)椋篿sKindOfClass:確定一個(gè)對(duì)象是否是一個(gè)類的成員,或者是派生自該類的成員。
根據(jù)iOS的類圖可以知道,UIViewController類還有好幾個(gè)派生類,需要我們?nèi)^(qū)分的就是UITabBarController跟UINavigationController,拿到它們不是我們想要的。
1)UITabBarController通過(guò)屬性viewControllers持有多個(gè)viewController;
2)UINavigationController通過(guò)壓棧和出棧的方式持有或去除viewController;
3)UITableViewController就不用去判斷了,它就是一個(gè)單個(gè)的viewController,而且更多的是手寫創(chuàng)建tableView。
提供一個(gè)完整的方法:
+ (UIViewController *)getCurrentViewController { UIViewController *result = nil; UIWindow * window = [[UIApplication sharedApplication] keyWindow]; //app默認(rèn)windowLevel是UIWindowLevelNormal,如果不是,找到它 if (window.windowLevel != UIWindowLevelNormal) { NSArray *windows = [[UIApplication sharedApplication] windows]; for(UIWindow * tmpWin in windows) { if (tmpWin.windowLevel == UIWindowLevelNormal) { window = tmpWin; break; } } } id nextResponder = nil; UIViewController *appRootVC = window.rootViewController; //1、通過(guò)present彈出VC,appRootVC.presentedViewController不為nil if (appRootVC.presentedViewController) { nextResponder = appRootVC.presentedViewController; }else{ //2、通過(guò)navigationcontroller彈出VC NSLog(@"subviews == %@",[window subviews]); UIView *frontView = [[window subviews] objectAtIndex:0]; nextResponder = [frontView nextResponder]; } //1、tabBarController if ([nextResponder isKindOfClass:[UITabBarController class]]){ UITabBarController * tabbar = (UITabBarController *)nextResponder; UINavigationController * nav = (UINavigationController *)tabbar.viewControllers[tabbar.selectedIndex]; //或者 UINavigationController * nav = tabbar.selectedViewController; result = nav.childViewControllers.lastObject; }else if ([nextResponder isKindOfClass:[UINavigationController class]]){ //2、navigationController UIViewController * nav = (UIViewController *)nextResponder; result = nav.childViewControllers.lastObject; }else{//3、viewControler result = nextResponder; } return result; }
從上面代碼中,可以衍生出獲取當(dāng)前tabBarController、navigationController,有時(shí)候可能就會(huì)用到。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
iOS 解決UICollectionView 計(jì)算 Cell 大小的問(wèn)題
本文主要介紹iOS UICollectionView,這里給大家一個(gè)實(shí)例代碼作為參考,并指出經(jīng)常遇到的問(wèn)題和解決辦法,希望能幫助有需要的小伙伴2016-07-07iOS實(shí)現(xiàn)知乎和途家導(dǎo)航欄漸變的文字動(dòng)畫效果
這篇文章給大家分享了利用iOS實(shí)現(xiàn)知乎和途家導(dǎo)航欄漸變的文字動(dòng)畫效果,有需要的朋友們可以參考借鑒。下面來(lái)一起看看。2016-09-09iOS實(shí)現(xiàn)賬號(hào)、密碼記住功能
這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)賬號(hào)、密碼記住功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03快速解決ios微信下audio無(wú)法自動(dòng)播放的問(wèn)題
下面小編就為大家分享一篇快速解決ios微信下audio無(wú)法自動(dòng)播放的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03iOS實(shí)現(xiàn)鎖屏頁(yè)面控制音樂(lè)播放
這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)鎖屏頁(yè)面控制音樂(lè)播放,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12iOS開發(fā)項(xiàng)目- 基于WebSocket的聊天通訊(1)
這篇文章主要介紹了iOS開發(fā)項(xiàng)目- 基于WebSocket的聊天通訊,WebSocket是web通信方式的一種,有需要的可以了解一下。2016-11-11