我感觉我自己的学习能力不是很好,一直以来,关于别人的博客,写的文章看的也不少了,但是,对于block还是一知半解的.只知道你写一个block,我调用一下就行了.但是,今天,我突然明白了,所以,今天,我分享一下我理解的.
这篇文章,分享的不是block的语法,不是教你怎么写block的,而是教你怎么用block.
不知道大家用代理用的好不好?我就是在项目中用了很多的代理,用的很烦很烦,但是,由于block一直不理解,所以,一直没有替换(通知也很麻烦).
今天理解了之后,发现代理和block其实是一样的,除了语法不一样,额,有点矛盾
先说说代理吧
- 在你自定义的文件里面声明一个协议(在这里,自定义的文件,我选的是一个view),在协议里面写方法
@protocol HXViewDelegate
- (void)clickView;
@end
将协议生成文件的属性
@property (nonatomic, weak) iddelegate;
然后,.h文件的代理声明全部完成,代码如下
#import
@protocol HXViewDelegate
- (void)clickView;
@end
@interface HXView : UIView
@property (nonatomic, weak) iddelegate;
@end
- 在.m中实现代理方法的点击
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
if ([self.delegate respondsToSelector:@selector(clickView)]) {
[self.delegate clickView];
}
}
用的时候,让用的控制器遵循一下协议,就可以调用clickView这个方法了.
- (void)text {
HXView *redView = [[HXView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
redView.delegate = self;
redView.backgroundColor = [UIColor redColor];
[self.view addSubview:redView];
}
- (void)clickView {
NSLog(@"%s", __func__);
}
代理是遵循协议,执行代理方法
而block是将代码封装,然后执行,还是和代理一样,声明block
@property (nonatomic, strong) void (^didSelectItem)(UICollectionView *collectionView, NSIndexPath *indexPath);
在.m文件中实现block
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
if (self.didSelectItem) {
self.didSelectItem(collectionView, indexPath);
}
}
在控制器中,将代码封装
- (void)text2 {
HXCollectionView *collectionView = [[HXCollectionView alloc] initWithFrame:self.view.bounds];
collectionView.dataArray = @[@1, @1, @1, @1, @1, @1, @1, @1, @1, @1];
[self.view addSubview:collectionView];
collectionView.didSelectItem = ^(UICollectionView *collectionView, NSIndexPath *indexPath) {
NSLog(@"%@", indexPath);
};
}
总结:
- 1.block比代理更简单
- 2.比代理的代码更集中
- 3.控制器不需要遵循很多的代理
源文件代码:https://github.com/TheifSeaMew/TextCollectionView.git