今天介绍一个自定义的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
下载地址:
网友评论
completion();
};
objc_setAssociatedObject(self, BuClickKey, block, OBJC_ASSOCIATION_COPY);
为什么没有直接用completion关联