美文网首页iOS开发
iOS巧用代码块替换代理

iOS巧用代码块替换代理

作者: CoderKK | 来源:发表于2017-07-10 10:34 被阅读337次

    前言

    代码块就是函数,一种“操作”,巧用代码块的过程就是传递函数,传递“操作” ,函数可以当成参数传递确实是一件很赞的事, 熟用代码块可以大大地提高开发效率,使代码更加简洁,至于代码块的基础知识,我就不再赘叙了。

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

    相关文章

      网友评论

        本文标题:iOS巧用代码块替换代理

        本文链接:https://www.haomeiwen.com/subject/ictrhxtx.html