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

今天介绍一个自定义的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地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容