【iOS】Block与代理的使用

本人其实是比较喜欢用Block的,因为用block写出来的代码,让我感觉代码要紧凑一些,看起来的时候,思路要清晰些,所以这估计也就是现在block将要代替代理的原因所在吧!

下面,直接进入主题:

一、block

block的书写看起来有点怪,其实你只要是懂了其思路,那就非常简单了!我这里就介绍一种初学者最容易记住的使用方法!

写block的时候,1、2、3、4步骤,都是在要传出只的对象中处理,只有最后一步,就是在接收传值的地方处理!

1.在我们传出事件类的.h中,对block进行定义;

2.我们定义好Block之后,在同一个.h文件中,将这个Block设置为这个类的公开属性;

3.我们还是在这个.h文件中,定义一次这个block的setter方法;

这里我把上面的上个步骤写下一起

/**
 *  定义一个Block : typedef returnType(^name)(arguments);
 *  
 *  typedef : 这是一个关键字,代表这里是在定义一个Block
 *  returnType : 这里代表返回值类型
 *  name : 这里是自己定义的一个Block的名字,这个名字相当于一个类名的使用
 *  arguments : 这里是代表要出入的参数
 */
typedef void(^AddButBlock)();
typedef NSString *(^ImgTapBlock)(NSInteger index);


// 设置为一个属性,是因为在后面我们需要拿着他来做事情,这里其实也是可以将他放到.m中,只是我们为了我们步骤更清晰,就写在了.h中
@property(nonatomic, strong) AddButBlock butBlock;
@property(nonatomic, strong) ImgTapBlock imgBlock;

// 很多人不理解为什么这里还要写一个setter方法出来,我这里解释一下,平时要是我们自己没有再次这么声明一个方法的话,我们在写block的时候,就会要自己去构建了,自己输入^{…………}、^NSString *(NSInteger index) {…………},这样的话还要去对应前面自己定义的block,看看那个block到底是有什么值传,返回了什么东西;要是我们这么声明一次的话,后面我们就可以直接敲下Enter键,直接自己生成了,我就只要输入逻辑代码了,就不要自己再次去构建block了!
- (void)setButBlock:(AddButBlock)butBlock;
- (void)setImgBlock:(ImgTapBlock)imgBlock;

4.我们去这类的.m文件中,要传出时间的地方,实现这个block;

// 我们在block传值的时候,要注意先判断block是否存在,要是不存在,也直接传值的话,那就是肯定要出问题的!
- (void)addButtonAction:(UIButton *)sender{
    if (self.butBlock) {
        self.butBlock();
    }
}
- (void)tapAction:(UITapGestureRecognizer *)tap{
    
    if (self.imgBlock) {
        NSString * str = self.imgBlock(tap.view.tag - 100);
        
        NSLog(@"%@",str);
    }
}

5.最后也就是我们在创建这个类的地方,用创建好的对象调用一下我们之前的那个setter方法,在block里面进行传值过来的操作!

    [someThing setButBlock:^{
        
        NSLog(@"%s",__func__);
        
    }];
    
    [someThing setImgBlock:^NSString *(NSInteger index) {
        
        NSLog(@"%s",__func__);
        
        return @"asdf";
    }];

这里就是平时我自己用block的5个步骤,虽然看起来有点麻烦,可是相比起代理来说,应该是要简单了很多啊!
下面我们来看看代理的使用吧 !还是就现在这个个例子!

二、代理

这里我也将其分解为了5个步骤,前3个步骤,是在要传出值得对象中做的,后面两个步骤,是在要获取值得对象中处理的,
鲜明的说法就是:1、2、3是在view里面做,4、5是在控制器里面做的!

1.自定义代理

@class ScrollView;
@protocol ScrollViewDelegate <NSObject>


// 这里就要注意了,要是没有声明@optional,就是默认的必须实现的代理方法,@optional是代表可选实现的意思!

@optional
- (void)scrollViewDidbutclik:(ScrollView *)scrollview;


@required
- (NSString *)scrollView:(ScrollView *)scrollview didImgclik:(NSInteger)index;


@end

2.设置代理属性

@property(nonatomic, weak) id<ScrollViewDelegate> delegate;

3.代理传值


    if ([self.delegate respondsToSelector:@selector(scrollViewDidbutclik:)]) {
        [self.delegate scrollViewDidbutclik:self];
    }


    if ([self.delegate respondsToSelector:@selector(scrollView:didImgclik:)]) {
        NSString * str = [self.delegate scrollView:self didImgclik:100];
        NSLog(@"%@",str);
    }



4.签代理


// 签代理的时候,有两个步骤:1.签协议、2.设代理

// 1.签协议
@interface UIViewController ()<ScrollViewDelegate>

// 2.设代理
someThing.delegate = self;

5.实现代理方法

- (NSString *)scrollView:(ScrollView *)scrollview didImgclik:(NSInteger)index{
    
    NSLog(@"%s",__func__);
    
    return @"adfasdf";
}
-  (void)scrollViewDidbutclik:(ScrollView *)scrollview{
    
    NSLog(@"%s",__func__);
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 禅与 Objective-C 编程艺术 (Zen and the Art of the Objective-C C...
    GrayLand阅读 5,587评论 1 10
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 13,909评论 6 13
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,390评论 30 472
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,810评论 19 139
  • 你一整天都在拿着手机,点赞,刷朋友圈,发朋友圈,却没有跟我说一句话,那又何必勉强自己坚持每晚跟我说“晚安”呢?我忘...
    Hocx阅读 1,036评论 0 0

友情链接更多精彩内容