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 www.90168.orgdidImgclik:(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__);
}

Tags:@IT·互联网   程序员   首页投稿

时间: 2024-12-24 06:32:30

Block与代理的使用的相关文章

iOS开发——项目实用技术OC篇&amp;将Block作为代理来使用,实现传值

将Block作为代理来使用,实现传值 在这里http://www.cnblogs.com/iCocos/p/4659878.html,笔者已经将代理,Block,通知传值的方式总结了一下,今天使用的不一样,我们这里使用的是在一个方法中将一个block代码保存起来,再回到blcok内部去执行. 这里使用的是在地图中,,,,好了不多说,开干 1:首先,定义一个blcok typedef void(^ResultBlock)(CLLocation *currentLoc, CLPlacemark *p

iOS开发——OC篇&amp;消息传递机制(KVO/NOtification/Block/代理/Target-Action)

iOS开发中消息传递机制(KVO/NOtification/Block/代理/Target-Action) 今晚看到了一篇好的文章,所以就搬过来了,方便自己以后学习 虽然这一期的主题是关于Foundation Framework的,不过本文中还介绍了一些超出Foundation Framework(KVO和Notification)范围的一些消息传递机制,另外还介绍了delegation,block和target- action. 大多数情况下,消息传递该使用什么机制,是很明确的了,当然了,在某

block和代理小结

代理使用原则: 代理方法的参数是要传的值,代理方法的返回值是要得到的值(即要调用的类回传的值),并且在实现的代理方法中的值就是原来的类要传的值(设置delegate=self), 比如2个类 A,B A类中有个代理方法(int)Adelegate(int a) B类实现代理方法(int)Adelegate(int a){ return b:} 那么 a是传给B类的值,而b是传给A类的值. 例子: 首先关于代理 @protocol NextViewControllerDelegate<NSObje

block与代理的异同点

block,以及代理什么时候要用到啊? 封装变化点,解决类耦合  block与代理之间的区别 1.block是在代理之后出现的技术,比代理更加灵活,但是可读性不好 2.代理在4.x之前一直都在使用,清晰明了,原生的组件变化点的封装基本都是用的是代理的方式(能够使得使用者,快速的开心的看出来有哪些方法,何时调用)

关于在TabBar 中添加按钮,并通过block 或代理在控制器中实现响应

相信很多朋友会遇到在TabBar中添加按钮,并要求点击按钮能够实现一些功能,但是当我们自定义的时候,怎么才能在控制器中响应?通常我会用代理或者block,block性能更好,建议使用. 自定义TabBar类 .h #import <UIKit/UIKit.h> typedef void(^myBlock) (NSArray *composeButton);//给block起别名,用数组来存放点击的Button @interface ZSTabBar : UITabBar @property (

iOS设计模式-Block实现代理的逻辑

在A页面,点击跳转到B页面,B页面操作完,回到A页面,并刷新A页面的内容.典型的例子,就是在一个列表里,点击新增,跳到新增页面,新增完,把数据传回给列表页,并刷新列表页里的内容. 这个,我平时一般是通过代理来实现,下面试着通过Block来实现. 在B页面定义Block,供A页面调用. 1 /** 2 * 确认订单选择返回block 3 */ 4 @property (nonatomic, strong) void (^ selectedAddressBlock)(HGAddressModel *

block和代理使用对比

demo设计:做简单的抽奖,在viewcontroller中调用代理和block去获得抽奖号码,在viecontroller中打印出来. 代理类的.h文件 @protocol DelegateClassDelegate; @interface DelegateClass : NSObject @property(nonatomic,weak) id<DelegateClassDelegate> delegate; -(void)dosomthing; @end @protocol Delega

iOS 设计模式-Block实现代理的逻辑

在A页面,点击跳转到B页面,B页面操作完,回到A页面,并刷新A页面的内容.典型的例子,就是在一个列表里,点击新增,跳到新增页面,新增完,把数据传回给列表页,并刷新列表页里的内容. 这个,我平时一般是通过代理来实现,下面试着通过Block来实现. 在B页面定义Block,供A页面调用. /** * 确认订单选择返回block */ @property (nonatomic, strong) void (^ selectedAddressBlock)(HGAddressModel * address

Block使用详解,Block与代理相比的优点

Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C语言的扩展,用来实现匿名函数的特性. Block是Apple Inc.为C.C++以及Objective-C添加的特性,使得这些语言可以用类lambda表达式的语法来创建闭包. 闭包就是能够读取其它函数内部变量的函数.就是在一段请求连续代码中可以看到调用参数(如发送请求)和响应结果.所以采用Block技术能够抽象出很多共用函数,提高了代码的可读性,可维护性,封装性. 不像代理声明了一个代理函数,在调用的类内部还要实现该函数,让