全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

iOS 获取当前的ViewController的方法

本文介绍了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小时内与您取得联系。