iOS 获取当前的ViewController的方法

 更新时间:2017年09月30日 14:51:23   作者:雨轩_99  
本篇文章主要介绍了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开发Firebase中的常用库使用及功能详解

    iOS开发Firebase中的常用库使用及功能详解

    这篇文章主要为大家介绍了iOS开发Firebase中的常用库使用及功能详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • iOS时钟开发案例分享

    iOS时钟开发案例分享

    这篇文章主要为大家分享了iOS时钟开发案例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • IOS 中弹框的实现方法整理

    IOS 中弹框的实现方法整理

    这篇文章主要介绍了IOS 中弹框的实现方法整理的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • iOS实现简单计算器功能

    iOS实现简单计算器功能

    这篇文章主要为大家详细介绍了iOS实现简单计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • IOS 开发之NSURL基本操作

    IOS 开发之NSURL基本操作

    这篇文章主要介绍了IOS 开发之NSURL基本操作的相关资料,需要的朋友可以参考下
    2017-03-03
  • iOS判断运营商类型的实现方法

    iOS判断运营商类型的实现方法

    下面小编就为大家带来一篇iOS判断运营商类型的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • 使用UItableview在iOS应用开发中实现好友列表功能

    使用UItableview在iOS应用开发中实现好友列表功能

    这篇文章主要介绍了使用UItableview在iOS应用开发中实现一个好友列表功能的方法,代码基于传统的Objective-C,需要的朋友可以参考下
    2015-12-12
  • iOS消息发送和转发示例详解

    iOS消息发送和转发示例详解

    这篇文章主要给大家介绍了关于iOS消息发送和转发的相关资料,用Objective-C的术语来讲,这叫做“给某个对象发送某条消息”。文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-03-03
  • iOS中UITableView使用的常见问题总结

    iOS中UITableView使用的常见问题总结

    这篇文章主要总结了iOS中UITableView使用的常见问题,其中包括如何设置headerView以及其高度、去掉多余cell的分割线 以及如何设置section数、行数等一系列的问题,文中介绍的更详细,需要的朋友们下面来一起看看详细介绍吧。
    2017-03-03
  • iOS仿支付宝芝麻信用分数仪表盘动画效果

    iOS仿支付宝芝麻信用分数仪表盘动画效果

    这篇文章主要为大家详细介绍了iOS仿支付宝芝麻信用分数仪表盘动画效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09

最新评论