- 按钮的点击事件传递可以用代理,通知,但是这些都比较繁琐,而Block写起来比较清爽下面我们以UITableViewCell中定制cell为例演示如何将cell上的按钮点击事件传递给控制器
- 首先是在定制的cell的.h文件中的代码示例:
// 用typef宏定义来减少冗余代码
typedef void(^ButtonClick)(UIButton * sender);// 这里的index是参数,我传递的是button的tag值,当然你可以自己决定传递什么参数
//下一步就是声明属性了,注意block的声明属性修饰要用copy
@property (nonatomic,copy) ButtonClick buttonAction;
到此.h文件大致就是这了
- 那么再来看下cell的.m文件内容:
- (void)buttonClick:(UIButton *)button{
// 判断下这个block在控制其中有没有被实现
if (self.buttonAction) {
// 调用block传入参数
self.buttonAction(button);
}
}
- 接下来我们来看控制器中的实现代码:
// 在创建cell的时候
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
JHTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"cellId"];
if (cell == nil) {
cell = [[JHTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cellId"];
}
// 就在这里cell初始化成功后去给Block赋值调用它的setter方法
cell.buttonAction = ^(UIButton *sender){
[self cellButtonClick:sender];// 在Block内部去调用一个方法,当然你也可以直接在这里写,只要你不嫌代码臃肿
};
return cell;
}
// 将方法抽出来放在外边看起来不至于让tableView的代理方法太臃肿
- (void) cellButtonClick:(UIButton *)button
{
// 这里就可以实现点击后的后续操作了
}