iOS 获取当前的ViewController的方法

发布时间 - 2026-01-11 03:30:05    点击率:

本文介绍了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 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何为不同团队 ID 动态生成多个“认领值班”按钮  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  Laravel观察者模式如何使用_Laravel Model Observer配置  如何在香港服务器上快速搭建免备案网站?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  在线制作视频的网站有哪些,电脑如何制作视频短片?  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  Laravel如何实现API速率限制?(Rate Limiting教程)  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  北京企业网站设计制作公司,北京铁路集团官方网站?  如何在Windows环境下新建FTP站点并设置权限?  如何快速搭建自助建站会员专属系统?  如何获取免费开源的自助建站系统源码?  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  北京网站制作的公司有哪些,北京白云观官方网站?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  html5的keygen标签为什么废弃_替代方案说明【解答】  使用C语言编写圣诞表白程序  Python函数文档自动校验_规范解析【教程】  JavaScript如何操作视频_媒体API怎么控制播放  EditPlus中的正则表达式 实战(1)  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  高防服务器租用首荐平台,企业级优惠套餐快速部署  网站制作免费,什么网站能看正片电影?  网站页面设计需要考虑到这些问题  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  香港服务器如何优化才能显著提升网站加载速度?  Laravel如何创建自定义Artisan命令?(代码示例)  如何快速生成高效建站系统源代码?  如何获取上海专业网站定制建站电话?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  利用python获取某年中每个月的第一天和最后一天  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  如何快速搭建高效服务器建站系统?  香港网站服务器数量如何影响SEO优化效果?  电商网站制作价格怎么算,网上拍卖流程以及规则?  Laravel API资源类怎么用_Laravel API Resource数据转换  如何在服务器上三步完成建站并提升流量?