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-07
iOS實(shí)現(xiàn)知乎和途家導(dǎo)航欄漸變的文字動(dòng)畫效果
這篇文章給大家分享了利用iOS實(shí)現(xiàn)知乎和途家導(dǎo)航欄漸變的文字動(dòng)畫效果,有需要的朋友們可以參考借鑒。下面來(lái)一起看看。2016-09-09
iOS實(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-03
iOS實(shí)現(xiàn)鎖屏頁(yè)面控制音樂(lè)播放
這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)鎖屏頁(yè)面控制音樂(lè)播放,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
iOS開發(fā)項(xiàng)目- 基于WebSocket的聊天通訊(1)
這篇文章主要介紹了iOS開發(fā)項(xiàng)目- 基于WebSocket的聊天通訊,WebSocket是web通信方式的一種,有需要的可以了解一下。2016-11-11

