iOS 獲取當前的ViewController的方法
本文介紹了iOS 獲取當前的ViewController,分享給大家。具體如下
通過簡單的判斷[UIViewController class],就認定它是想要的控制器是不對的:
if ([nextResponder isKindOfClass:[UIViewController class]]) {
result = nextResponder;
}else {
result = window.rootViewController;
}
因為:isKindOfClass:確定一個對象是否是一個類的成員,或者是派生自該類的成員。
根據(jù)iOS的類圖可以知道,UIViewController類還有好幾個派生類,需要我們?nèi)^(qū)分的就是UITabBarController跟UINavigationController,拿到它們不是我們想要的。
1)UITabBarController通過屬性viewControllers持有多個viewController;
2)UINavigationController通過壓棧和出棧的方式持有或去除viewController;
3)UITableViewController就不用去判斷了,它就是一個單個的viewController,而且更多的是手寫創(chuàng)建tableView。

提供一個完整的方法:
+ (UIViewController *)getCurrentViewController {
UIViewController *result = nil;
UIWindow * window = [[UIApplication sharedApplication] keyWindow];
//app默認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、通過present彈出VC,appRootVC.presentedViewController不為nil
if (appRootVC.presentedViewController) {
nextResponder = appRootVC.presentedViewController;
}else{
//2、通過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;
}
從上面代碼中,可以衍生出獲取當前tabBarController、navigationController,有時候可能就會用到。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
實例講解如何在iOS應(yīng)用開發(fā)中使用設(shè)計模式中的代理模式
這篇文章主要介紹了實例講解如何在iOS應(yīng)用開發(fā)中使用設(shè)計模式中的代理模式,示例為傳統(tǒng)的Objective-C語言代碼,需要的朋友可以參考下2016-03-03
iOS scrollview實現(xiàn)三屏復(fù)用循環(huán)廣告
這篇文章主要介紹了iOS scrollview實現(xiàn)三屏復(fù)用循環(huán)廣告,從服務(wù)器請求的廣告,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01
Objective-C實現(xiàn)冒泡排序算法的簡單示例
冒泡排序即是依次比較相鄰的兩個數(shù),如果后面的數(shù)較小則交換到前面一個數(shù)的位置上,這里我們來看一下Objective-C實現(xiàn)冒泡排序算法的簡單示例2016-06-06

