美文网首页iOS 开发iOS开发札记iOS收藏
以block形式返回按钮动作的按钮

以block形式返回按钮动作的按钮

作者: idage | 来源:发表于2016-05-07 16:29 被阅读939次

    今天介绍一个自定义的UIButton控件,它可以不再使用 - (void)addTarget:(nullable id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;方法来触发按钮的动作,而改成用一个block的方式来出发动作,这样处理后,一可以降低代码的分散度,二当我再次查看按钮的触发方法实现细节时就不用点command跳到方法里,而是在按钮的初始化位置就能看到按钮的点击处理方法。这样做会不会对你有点诱惑呢?

    ( 一 )block用途简介:

    block 是一种可以在C/C++/Objective-C 代码中使用的”词法闭包“,它极为有用。开发者借由此机制可以将代码像对象一样传递,令其在不同的环境下运行。还有个关键的地方,在定义”块“的范围内,它可以访问其中的全部变量。总之就是好处多多。

    一般我用它来回调:

    ```

    [VC setBlock:^(NSString *name){

    //do something

    }];

    [self.navigationController pushViewController:VC animated:YES];

    ```

    还有我会用它来封装自定义的控件,响应控件的动作:

    DGCustomView *customView = [[DGCustomView alloc]init];

    [customView setDGCustomVBlock:^(id contentStr){

    //do something

    }];

    还会用它来降低代码分散度:

    void (^dealingResult)(NSArray * ) = ^(NSArray *data){

    //处理数据

    };

    //本地数据库获取数据

    localArray = [database getData];

    if(localArray.count>0){

    dealingResult(localArray);

    return;

    }

    //网络获取数据

    netDataArray =[nsetTools getData];

    if(netDataArray.count>9){

    dealingResult(netDataArray);

    }

    (二)这种button具体的实现:

    初始化按钮:

    BlockButton继承于UIButton

    BlockButton *button = [BlockButton buttonWithType:UIButtonTypeCustom];

    [button setFrame:frame];

    [self.view addSubview:button];

    [button addActionforControlEvents:UIControlEventTouchUpInside respond:^{

          NSLog(@"点击按钮了");//do something

    }];

    自定义按钮是实现也很简单:

    #import "BlockButton.h"

    #import <objc/runtime.h>

    static void *BuClickKey = @"BuClickKey";

    @implementation BlockButton

    - (void)addActionforControlEvents:(UIControlEvents)controlEvents respond:(DGCompletionHandler)completion{

    [self addTarget:self action:@selector(didClickBU) forControlEvents:controlEvents];

    void (^block)(void) = ^{

    completion();

    };

    objc_setAssociatedObject(self, BuClickKey, block, OBJC_ASSOCIATION_COPY);

    }

    -(void)didClickBU{

    void (^block)(void) = objc_getAssociatedObject(self, BuClickKey);

    block();

    }

    感谢您的查看和意见----idage

    下载地址:

               github地址

    相关文章

      网友评论

      本文标题:以block形式返回按钮动作的按钮

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