本文介绍了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
# 获取ViewController
# 获取当前ViewController
# iOS如何获取最顶层ViewController详解
# iOS使用pageViewController实现多视图滑动切换
# iOS开发教程之UIView和UIViewController的生命周期详解
# iOS 修改alertViewController弹框的字体颜色及字体的方法
# IOS 下获取 rootviewcontroller 的版本不同的问题解决办法
# iOS开发学习 ViewController使用示例详解
# 是一个
# 弹出
# 的是
# 就会
# 多个
# 它是
# 给大家
# 或者是
# 如果不是
# 不为
# 提供一个
# 它就
# 好几个
# 大家多多
# 到它
# 过压
# 派生类
# UITableViewController
# UIViewController
# class
相关文章:
制作网页的网站有哪些,电脑上怎么做网页?
如何通过万网虚拟主机快速搭建网站?
网站制作免费,什么网站能看正片电影?
家具网站制作软件,家具厂怎么跑业务?
南京网站制作费用,南京远驱官方网站?
如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法
海南网站制作公司有哪些,海口网是哪家的?
ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?
如何在局域网内绑定自建网站域名?
音响网站制作视频教程,隆霸音响官方网站?
C#如何序列化对象为XML XmlSerializer用法
个人网站制作流程图片大全,个人网站如何注销?
深圳网站制作案例,网页的相关名词有哪些?
济南网站制作的价格,历城一职专官方网站?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
Python多线程使用规范_线程安全解析【教程】
建站主机默认首页配置指南:核心功能与访问路径优化
如何选择高效响应式自助建站源码系统?
如何批量查询域名的建站时间记录?
内部网站制作流程,如何建立公司内部网站?
如何设计高效校园网站?
教育培训网站制作流程,请问edu教育网站的域名怎么申请?
c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】
建站之星在线客服如何快速接入解答?
如何快速建站并高效导出源代码?
如何访问已购建站主机并解决登录问题?
如何在橙子建站中快速调整背景颜色?
seo网站制作优化,网站SEO优化步骤有哪些?
如何用AWS免费套餐快速搭建高效网站?
家庭建站与云服务器建站,如何选择更优?
如何通过VPS搭建网站快速盈利?
如何通过WDCP绑定主域名及创建子域名站点?
如何选择最佳自助建站系统?快速指南解析优劣
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
如何通过虚拟机搭建网站?详细步骤解析
网站微信制作软件,如何制作微信链接?
Java解压缩zip - 解压缩多个文件或文件夹实例
建站之星官网登录失败?如何快速解决?
建站之星安装提示数据库无法连接如何解决?
北京营销型网站制作公司,可以用python做一个营销推广网站吗?
如何在建站主机中优化服务器配置?
如何在云主机上快速搭建多站点网站?
代刷网站制作软件,别人代刷火车票靠谱吗?
建站之星如何助力网站排名飙升?揭秘高效技巧
三星网站视频制作教程下载,三星w23网页如何全屏?
淘宝制作网站有哪些,淘宝网官网主页?
如何用PHP快速搭建高效网站?分步指南
建站之星ASP如何实现CMS高效搭建与安全管理?
建站主机数据库如何配置才能提升网站性能?
定制建站如何定义?其核心优势是什么?
*请认真填写需求信息,我们会在24小时内与您取得联系。