以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

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形式返回按钮动作的按钮)