iOS-从任何一个view中获得当前控制器

背景:

开篇,我必须要先吐槽一番CSDN的新版块风格。好看是好看了,有点像简书的风格了。但是,你的MarkDown编辑器能不能别变来变去的。作为一个有强迫症的人,我一次性修改了20+篇博客的格式。

说回正题,有时候,我们可能封装了一个库给别人用,但是库里面可能要用到控制器(库里面,一般是不会有控制器的)。另一种情况,你的代码分层比较明显,逻辑比较清晰,那么在View层的时候,你若是想要用到控制器,怎么办?对于第二种情况,可能比较好办,那么就用通知,那么就block回调,要么就delegate代理。

不过,最近看到一个方法,能从任何一个view中拿到当前的控制器。


封装方法

+(UIViewController *)getCurrentVCWithCurrentView:(UIView *)currentView
{
    for (UIView *next = currentView ; next ; next = next.superview) {
        UIResponder *nextResponder = [next nextResponder];
        if ([nextResponder isKindOfClass:[UIViewController class]]) {
            return (UIViewController *)nextResponder;
        }
    }
    return nil;
}




我稍微修改了一点点东西,网上另一个的版本是这样的:

//当前视图
-(UIViewController *)currentViewController{
    UIViewController *vc;
    for (UIView* next = [self superview]; next; next = next.superview) {
        UIResponder* nextResponder = [next nextResponder];
        if ([nextResponder isKindOfClass:[objc_getClass("UIViewController") class]] ) {
            vc=(UIViewController*)nextResponder;

            return vc;
        }
    }
    return vc;
}




如果你细心看,你会发现,我把for遍历的第一个参数改成了当前view

如果你理解他这个for循环的意思,那么你就知道我为什么要把第一个参数改成当前的view了。因为,如果当前的view是控制器的自视图的话,那么这个view根本就没有父视图。


分析方法

//第一个for循环
for (int i = 0;i < 9;i ++)

//第二个for循环
for (UIView *next = currentView ; next ; next = next.superview)

有编程基础的人,都知道我第一个for循环的意思。

简单说一下第一个for循环的过程:定义一个变量i,给他赋初始值0。for循环执行一遍代码,判断i是否小于9,如果小于9,那么i加一。如果i大于9,那么终止for循环。

那么按照第一个for循环的套路,我们来探究第二个for循环是什么意思:定义一个UIView类型变量next,给他赋初始值为当前的view。执行一遍for循环,判断next是否存在,存在的话,把next的父视图赋值给next。如果next不存在,那么终止for循环。




 UIResponder* nextResponder = [next nextResponder];
        if ([nextResponder isKindOfClass:[objc_getClass("UIViewController") class]] ) {
            vc=(UIViewController*)nextResponder;

            return vc;


而这里的代码涉及到响应者对象的知识。如果next视图的响应者的类是UIViewController,那么表明他已经取到了当前控制器了,返回即可。


可以参考:

iOS-响应者链条
iOS-事件传递过程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值