我們在ios開發(fā)中,我們經(jīng)常需要獲取viewcontroller,下面就讓我們一起來看看武林技術(shù)頻道小編為大家介紹的iOS 獲取當(dāng)前的ViewController的方法,希望能幫到您。
通過簡單的判斷[UIViewController class],就認(rèn)定它是想要的控制器是不對的:
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默認(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、通過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;}從上面代碼中,可以衍生出獲取當(dāng)前tabBarController、navigationController,有時候可能就會用到。
以上就是由武林技術(shù)頻道小編帶來的iOS 獲取當(dāng)前的ViewController的方法?希望對大家有所幫助!如果你已經(jīng)知道怎么操作,那么你就趕快行動起來吧!
新聞熱點
疑難解答
圖片精選