iOS 获取当前的ViewController的方法
2017-09-30 14:51
701 查看
本文介绍了iOS 获取当前的ViewController,分享给大家。具体如下
通过简单的判断[UIViewController class],就认定它是想要的控制器是不对的:
if ([nextResponder isKindOfClass:[UIViewController class]]) { result = nextResponder; }else { result = window.rootViewController; }
因为:isKindOfClass:确定一个对象是否是一个类的成员,或者是派生自该类的成员。
根据iOS的类图可以知道,UIViewController类还有好几个派生类,需要我们去区分的就是UITabBarController跟UINavigationController,拿到它们不是我们想要的。
1)UITabBarController通过属性viewControllers持有多个viewController;
2)UINavigationController通过压栈和出栈的方式持有或去除viewController;
3)UITableViewController就不用去判断了,它就是一个单个的viewController,而且更多的是手写创建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,有时候可能就会用到。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
相关文章推荐
- 获取iOS应用中当前处于Activity状态的ViewController
- iOS didFinishLaunchingWithOptions方法里获取storyBoard的rootViewController
- 获取iOS应用中当前处于Activity状态的ViewController
- [iOS 获取当前窗口导航控制器中栈顶viewController] 不普遍适用
- iOS之获取当前view的控制器、当前应用的tabbarController、navigationController中指定viewController
- IOS获取当前ViewController
- cocos2dx 在ios下获取当前ViewController
- 获取iOS应用中当前处于Activity状态的ViewController
- iOS 获取当前的ViewController
- IOS MPMoviePlayerViewController 获取当前音频文件播放时间点
- 完整获取当前ViewController的方法
- iOS开发 获取当前视图最顶层的ViewController
- iOS 获取当前最顶层的ViewController
- iOS开发 获取当前正在显示的ViewController(包含Push的和presented的)
- iOS开发 - 获取当前View最顶层的ViewController
- 【iOS开发】获取当前view(视图)所在的Controller(控制器)
- iOS 获取当前正在显示的ViewController
- iOS 利用visibleViewController和topViewController获取当前显示的页面区别
- iOS如何获取当前View所在控制器的方法
- IOS 使用presentViewController方法跳转的navigationController如何获取及视图层级关系