美文网首页
没事看着玩~

没事看着玩~

作者: 辛乐 | 来源:发表于2018-05-25 10:26 被阅读59次

    那天抽风想自己看看链式编程的实现~~前有RAC太强大好使,我这纯粹看看思路,就当看着玩~

    UIButton *btn = [[UIButton alloc] init];
        btn.xl_frame(CGRectMake(0, 0, 80, 30)).xl_title(@"测试一把~~");
        [btn addActionBlock:^(UIButton *btn) {
            LOG(@"点击了~~咋地!");
        } forControlEvents:(UIControlEventTouchUpInside)];
    

    1.UIButton+XLBlock.h 文件

    #import <UIKit/UIKit.h>
    typedef void(^BtnActionBlock)(UIButton *btn);
    typedef UIButton *(^XLBtnFrameBlock)(CGRect frame);
    typedef UIButton *(^XLBtnTitleBlock)(NSString *title);
    @interface UIButton (XLBlock)
    
    @property (nonatomic, copy)XLBtnFrameBlock xl_frame;
    @property (nonatomic, copy)XLBtnTitleBlock xl_title;
    -(void)addActionBlock:(BtnActionBlock)actionBlock forControlEvents:(UIControlEvents)event;
    
    @end
    

    1.UIButton+XLBlock.m 文件

    #import "UIButton+XLBlock.h"
    #import <objc/runtime.h>
    
    @implementation UIButton (XLBlock)
    
    #pragma mark -- 点语法实现链式调用(测试学习代码原理)
    #pragma mark -- frame的处理:(只是处理 [返回当前对象并携带要处理当前对象参数变量的block] 的get方法)
    -(XLBtnFrameBlock)xl_frame{
        XLBtnFrameBlock block = ^(CGRect frame){//get方法里定义block
            self.frame = frame;
            return self;
        };
        return block;
    }
    
    -(void)setXl_frame:(XLBtnFrameBlock)xl_frame{
        //空实现
    }
    
    #pragma mark -- title的处理
    -(XLBtnTitleBlock)xl_title{
        XLBtnTitleBlock block = ^(NSString *title){
            [self setTitle:title forState:UIControlStateNormal];
            return self;
        };
        return block;
    }
    
    -(void)setXl_title:(XLBtnTitleBlock)xl_title{
        //空实现
    }
    
    -(void)addActionBlock:(BtnActionBlock)actionBlock forControlEvents:(UIControlEvents)event{
        
        __weak typeof(self) weakSelf = self;
        if (actionBlock){
            objc_setAssociatedObject(self, "BtnActionBlock", actionBlock, OBJC_ASSOCIATION_COPY);//KVC增加示例变量
        }
        [self addTarget:weakSelf action:@selector(btnAction:) forControlEvents:UIControlEventTouchUpInside];
    }
    
    - (void)btnAction:(UIButton *)btn
    {
        BtnActionBlock block = objc_getAssociatedObject(self, "BtnActionBlock");//取出实例变量
        if (block) {
            block(btn);
        }
    }
    

    相关文章

      网友评论

          本文标题:没事看着玩~

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