美文网首页iOS开发技术分享iOS魔法书
获得当前view所在的控制器

获得当前view所在的控制器

作者: 喵子G | 来源:发表于2017-05-15 17:44 被阅读661次

    某些情况下,控制器下的view不能够直接和控制器来交互。比如在复杂的界面纯代码实现中,我们经常考虑的就是将视图分块,每一块用一个UIView封装,当着模块中的subView需要相应屏幕触摸操作并传导给控制器来进行跳转。又或者UITablView中cell的子试图需要和控制器进行交互的情况。
    这种情况下用代理或者block显然很不好,view --(delegate、block)> parentView --(delegate、block)> ViewController,当然是可以实现,但是代码太多,并且并名是个问题,都是一样的目的,怎么给这些同样目的的方法命名呢。通知也是一个办法,但是也不是一个好办法,明明是一个模块并且纵向的结构,是不应该用通知来解决问题的。
    这里可以用最简单的响应链遍历的方式,获取一个试图的当前所在的控制器:

    #import <UIKit/UIKit.h>
    
    @interface UIView (JKRViewController)
    
    /// 当前视图最近一级的UIViewController
    @property (nonatomic, strong, readonly) UIViewController *jkr_viewController;
    
    @end
    
    #import "UIView+JKRViewController.h"
    
    @implementation UIView (JKRViewController)
    
    - (UIViewController *)jkr_viewController {
        UIResponder *next = [self nextResponder];
        do {
            if ([next isKindOfClass:[UIViewController class]]) {
                return (UIViewController *)next;
            }
            next = [next nextResponder];
        } while (next != nil);
        return nil;
    }
    
    @end
    

    这样,当需要获取一个UIView对象所在的控制器的时候,只需要调用self.jkr_viewController就可以了。比如在UITableView的cell中有一个UIImageView用来显示头像,点击头像需要跳转用户详情页的时候,只需要在UIImageView的touchesBegan方法中直接跳转就可以了:

    [self.jkr_viewController presentViewController:userDetailViewController animated:YES completion:nil];
    

    这样,在使用父子控制器、多层视图封装、列表视图的时候,就可以很方便的进行界面跳转的操作,避免过多的精力和时间思考在事件传递上面。
    源码链接

    相关文章

      网友评论

        本文标题:获得当前view所在的控制器

        本文链接:https://www.haomeiwen.com/subject/unbhxxtx.html