iOS 获取当前的ViewController的方法
程序员文章站
2023-12-17 21:16:58
本文介绍了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,有时候可能就会用到。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。