接触block是在两天前,那时候的我还在为自己封装的View如何传递事件(比如Button的点击事件、手势….)而头疼不已。既然要封装,就应该把控件的事件都封好,我是这样想的。
于是我第一次使用的block,见证了它的强大。
这个就是我封装的一个View,上面是一个UIImageView做头像,和一个UIImageView做背景,还有一个Label。
主要功能就是点击iconView可以进行修改头像这个工具,功能很简单 没有什么特别的,之所以封装是因为很多地方都要用到这个View。
我给iconView加上点击手势 代码如下:
// 添加点击手势
[ self.iconView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(changeIconAndName)]];
changeIconAndName这个方法,但是跳装界面可不能封装在View里,因为别的界面的iconView点击跳转的界面也是不一样的。
所以,要告诉外面,让外面去跳装。怎么办呢?这时候block就派上大用场了。
// 通知外部 点击了手势
-(void)changeIconAndName
{
self.tapTargetClickBlock();
}
当当当当~~~~ 对,没有看错,就这么一句代码就实现了。不过前提需要定义一个block作为这个View 的成员变量。
在.h里面:
typedef void(^TapTargetClickBlock)();
@interface HeaderView : UIView
//点击手势触发之后的block
@property (nonatomic ,copy) TapTargetClickBlock tapTargetClickBlock;
@property(strong,nonatomic)UIView *myHeaderView;
…
…
…
@end
这样外面就可以调用这个block了。
外面需要用iconView的地方:
myHeaderView.tapTargetClickBlock = ^{
NSLog(@"点击了头像");
[self.navigationController pushViewController:[[MyEditViewController alloc]init] animated:YES];
};
ok了。跳转不同的界面这要在这里面指定就OK了。通过block不超过十行代码就封好了。
button点击事件也是同样的方法。
block真是太强大,❤️上它了。