iOS开发中,界面之间传递消息或者数据是最基本的一种需求,我们可以使用很多方法来实现这种需求,比如在头文件中暴露一个属性、比如使用notification(一对多的消息传递)等等。今天我们要来介绍另一种方式:使用delegate传递消息(一对一的消息传递)。
delegate称为委托,同时也是一种代理设计模式。使用委托避免了类与类的耦合度过高。利用委托赋值更加安全可控,委托赋值在不暴露自己类的属性的前提下就可以对自己进行赋值。
在iOS中委托通过协议@protocol来实现,在协议中所声明的方法,不需要在协议中有实现的方法,是由它的实现类来实现(该类需要在头文件中包含<协议名>)。“协议”和“委托”是两个不一样的概念,因为我们在看代码的时候总是会看到他们出现在一起。但不能说,delegate就是protocol,delegate是一种架构模式。举个例子什么是“委托”:比如我在开车,但是开车不能看短信,所以我就叫车里的朋友帮我看短信,这样我就可以正常的开车了。当朋友看完短信内容后,就告诉我是什么内容。这就是委托,朋友就是我的委托对象。“协议”protocol是用来定义对象的属性和行为,类似于C++中的虚函数。其中有两个关键字@required和@optional,前者表示必须要实现的方法,后者是可选的方法。
使用delegate常用在两种情况下:
*两个类之间的传值,类A调用类B的方法,类B在执行过程中遇到问题通知类A;
*控制器(ViewController)与控制器(ViewController)之间的传值,从A跳转到B,再从B返回到A时需要通知A更新UI或者是做其他的事情,这时候就用到了代理(delegate)传值。
tips:如果没有在@protocol中显式的写上@required或者@optional,那么默认就是@required(必需的)的。为了不引起歧义,最好显式的写上@required或@optional。
通常一个delegate的使用过程需要经过5步:
(1)创建一个delegate;
(2)委托者声明一个delegate;
(3)委托者调用delegate内的方法(method);
(4)被委托者设置delegate,以便被委托者调用;
(5)被委托者实现delegate所定义的方法;
下面我通过1个实例来演示使用delegate传递数据,代码上传至: