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__);
}
Block与代理的使用的更多相关文章
- block和代理小结
代理使用原则: 代理方法的参数是要传的值,代理方法的返回值是要得到的值(即要调用的类回传的值),并且在实现的代理方法中的值就是原来的类要传的值(设置delegate=self), 比如2个类 A,B ...
- iOS开发——OC篇&消息传递机制(KVO/NOtification/Block/代理/Target-Action)
iOS开发中消息传递机制(KVO/NOtification/Block/代理/Target-Action) 今晚看到了一篇好的文章,所以就搬过来了,方便自己以后学习 虽然这一期的主题是关于Fou ...
- iOS block和代理的区别
block和代理是iOS开发中实现回调的两种方式,大多数情况下是用哪个都可以,主要看个人喜好.本文主要是对两者做一下对比. 1.block简介 在 iOS中, block一共分三种. (1 ...
- IOS中block和代理
从ios4开始引入block,就是代码块,结构类c语言 基本结构 返回值 (^block名称)(参数):int(^BlockName)(int):返回值为int型,参数是一个int值的叫BlockNa ...
- iOS之 block,代替代理作为回调函数
最近在弄一个视频会议的项目,但今天要说的跟视频基本没关系,我们来说一下在一个view中创建一个button,在controller中加载这个view 当button被点击后将时间响应传递给contro ...
- iOS开发之巧用Block和代理方法结合来传值
好久没写技术博客了,因为996的工作周期已经持续好几个月了.每天晚上回家都没有太多精力学习很多其他的东西,而且很多时候是接着完善工作的项目的模块开发.所以博客停歇了这么久,更新率也低了不少,今天补充一 ...
- iOS设计模式-Block实现代理的逻辑
在A页面,点击跳转到B页面,B页面操作完,回到A页面,并刷新A页面的内容.典型的例子,就是在一个列表里,点击新增,跳到新增页面,新增完,把数据传回给列表页,并刷新列表页里的内容. 这个,我平时一般是通 ...
- 关于在TabBar 中添加按钮,并通过block 或代理在控制器中实现响应
相信很多朋友会遇到在TabBar中添加按钮,并要求点击按钮能够实现一些功能,但是当我们自定义的时候,怎么才能在控制器中响应?通常我会用代理或者block,block性能更好,建议使用. 自定义TabB ...
- iOS 设计模式-Block实现代理的逻辑
在A页面,点击跳转到B页面,B页面操作完,回到A页面,并刷新A页面的内容.典型的例子,就是在一个列表里,点击新增,跳到新增页面,新增完,把数据传回给列表页,并刷新列表页里的内容. 这个,我平时一般是通 ...
随机推荐
- 在HTML网页中设置弹出窗口的办法
[1.最基本的弹出窗口代码] 其实代码非常简单: <SCRIPT LANGUAGE="javascript"> <!-- window.open ('page.h ...
- html5手机网站需要加的那些meta/link标签,html5 meta全解
原文链接:http://blog.csdn.net/kongjiea/article/details/17092413(收藏专用!如需转载,请点击链接,联系博主,获得同意后方可转载) 3.name之设 ...
- NYOJ题目840吃花生
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAskAAAKdCAIAAABeSGNbAAAgAElEQVR4nO3dPXKkuvv28f8mnHshjn
- webservice 简单入门 (NLY)
1,创建webservice服务器端 搭建网站,创建webservice webservice.cs中的代码 namespace WebApplication1 { /// <summary&g ...
- MVC缓存02,使用数据层缓存,添加或修改时让缓存失效
在"MVC缓存01,使用控制器缓存或数据层缓存"中,在数据层中可以设置缓存的有效时间.但这个还不够"智能",常常希望在编辑或创建的时候使缓存失效,加载新的数据. ...
- Linux文件系统(inode、block……)
内容源于<鸟哥的Linux私房菜> 认识 EXT2 文件系统 文件系统的特殊观察与操作 文件系统 superblock,inode,block superblock,inode,block ...
- 在SSIS包中的事务处理
在处理SSIS包的数据ETL操作过程中,我们经常遇到的一个问题就是一系列步骤在运行的过程中,如果中间的一个步骤失败了,那么我们就需要清理前面已经运行过的步骤所产生的数据或者结果,这往往是一个很头疼的过 ...
- 关于strcpy_s
#include"stdafx.h" #include<iostream> #include<cstring> int main() { using nam ...
- Solr入门之(2)快速启动:第一个例子
Solr作为一个web应用来启动,因此需要JDK支持,需要WEB容器,本文环境如下: JDK6.0或以上(环境变量设置等不再赘述) Tomcat-6.0.35或以上(自行下载) apache-solr ...
- centos(x86 64位系统)使用boost
1. 安装gcc,g++,make等开发环境 yum groupinstall "Development Tools" 2. 安装boost yum install boost b ...