iOS开发

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自动帮你填充,个人推荐这样使用。

上一篇下一篇

猜你喜欢

热点阅读