欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS 获取当前的ViewController的方法

程序员文章站 2023-12-20 15:58:22
本文介绍了ios 获取当前的viewcontroller,分享给大家。具体如下 通过简单的判断[uiviewcontroller class],就认定它是想要的控制器是不...

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

iOS 获取当前的ViewController的方法

提供一个完整的方法:

+ (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,有时候可能就会用到。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

上一篇:

下一篇: