iOS巧用代码块替换代理
2017-07-10 本文已影响337人
CoderKK
前言
代码块就是函数,一种“操作”,巧用代码块的过程就是传递函数,传递“操作” ,函数可以当成参数传递确实是一件很赞的事, 熟用代码块可以大大地提高开发效率,使代码更加简洁,至于代码块的基础知识,我就不再赘叙了。
代码块Block替换代理Delegate
设想场景:TestView里有一个按钮,点击过后需要把这个点击动作暴露出而且把该button传出来,并把来告诉使用TestView的使用者,按钮被点击。
用传统的代理方式实现
//在TestView.h中
@protocol TestViewDelegate <NSObject>
- (void)testViewDidClickBtn:(UIButton *)button;
@end
@interface TestView : UIView
@property (nonatomic, assign) id<TestViewDelegate> delegate;
@end
//在TestView.m中,按钮点击事件处理
- (void)btnClick:(UIButton *)button{
NSLog(@"按钮被点击....");
if ([self.delegate respondsToSelector:@selector(testViewDidClickBtn:)]) {
[self.delegate testViewDidClickBtn:button];
}
}
//在ViewCotroller中使用TestView
@interface ViewController ()<TestViewDelegate>//第一步:遵循协议
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
TestView *testView = [[TestView alloc] initWithFrame:CGRectMake(20, 50, 100, 100)];
testView.delegate = self;//第二步:设置代理
[self.view addSubview:testView];
}
//第三步:实现代理方法
- (void)testViewDidClickBtn:(UIButton *)button{
NSLog(@"捕捉到%@按钮被点击,这里需要做一些按钮点后的操作",button);
}
用代码块方式实现
//在TestView.h中
@interface TestView : UIView
- (void)didClickBtn:(void (^) (UIButton *button))clickBlock;
@end
//在TestView.m中
@interface TestView()
@property (nonatomic, copy) void (^clickBlock) (UIButton *button);//定义相对应的代码块
@end
@implementation TestView
//实现didClickBtn方法
- (void)didClickBtn:(void (^)(UIButton *))clickBlock{
self.clickBlock = [clickBlock copy];//将这个函数(“操作”)传递给该类,先保存起来
}
//按钮点击事件处理
- (void)btnClick:(UIButton *)button{
//按钮点击后,执行这个clickBlock代码块,并把button传递过去
if (self.clickBlock) self.clickBlock(button);
}
@end
//在ViewCotroller中使用TestView
- (void)viewDidLoad {
[super viewDidLoad];
TestView *testView = [[TestView alloc] initWithFrame:CGRectMake(20, 50, 100, 100)];
[self.view addSubview:testView];
[testView didClickBtn:^(UIButton *button) {//一步即可
NSLog(@"捕捉到%@按钮被点击,这里需要做一些按钮点后的操作",button);
}];
}
总结
对比两种方式,你就会发现代码块方式,封装好后,使用起来会便捷许多,而不用代理的三步操作繁琐的操作。我见过大多数人用代码块替换代理的方式,只是将代码块当成参数之后便了事,如果你稍加留意,会发现我多了一个步骤,用方法把代码块传进去,这样的好处就是你写好后,使用者使用起来会很方便,不用手动去写代码块格式、参数,调用方法直接回车XCode自动帮你填充,个人推荐这样使用。