当前位置: 移动技术网 > 移动技术>移动开发>IOS > iOS 获取当前的ViewController的方法

iOS 获取当前的ViewController的方法

2019年07月24日  | 移动技术网移动技术  | 我要评论
本文介绍了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。

提供一个完整的方法:

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

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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网