delegate介绍

delegate介绍

delegation委托其实也是一种架构设计模式,主要是由一个委托对象托给另一个对象去做它的工作。这里面需要用protocol协议实现,协议由requested必要方法,和option可选方法两种,协议提供编程接口,给调用者实现协议中的方法。

使用delegation的场景:

实现不同页面间的数据交互,可以用在页面跳转,界面传值,跳转页面刷新数据以及监听事件等等,当delegate的事件触发时,delegate才会被调用。

建立两个页面 A 和 B,我们假设他们的文件名为ControllerAControllerB

由A页面,点击跳转到B页面。在B页面中,进行一些操作,并得到一个值,并将这个值传回给A页面,并在A页面上显示出来(或者进行其他的操作)

首先,我们要在ControllerB.h 文件中声明协议(在interface那一行的前面),同时声明委托代理人(在interface那一行的后面):

@protocol ControllerBDelegate //声明协议,一般格式是 类名+delegate

//代理方法
@required//required表示一定要实现,optional则是可以选择实现的

-(void)sendAMessage:(NSString*)msg;
//-(void)触发事件名:(参数类型)参数名;

@end

@interface ControllerB :UIViewController

//委托代理人,注意是weak
@property(nonatomic,weak)id delegate;

@end

接下来在 C****ontrollerB.m 的文件中写入:

-(void)whenSomethingHappened //controllerB中的事件被触发,比如你可以让一个按钮的点击事件为这个函数
{
   NSString *message = @"世界属于三体!";
    if([_delegate respondsToSelector:@selector(sendAMessage:)])  { //如果协议响应了sendMessage:方法
    [ _delegate sendAMessage:message ];//通知执行协议方法
    }
}

接下来,在 ControllerA.m 文件中 增加delegate的定义:

@interface ControllerA()

@end

并且在 ControllerA.m 中实例化一个controllerB,同时一定要在实例化controllerB之后添加下面这个语句将controllerB的被委托人设置为自己。

ControllerB *controllerB = [[controllerB alloc] init];
controllerB.delegate=self;//设置代理

之后在 controllerA.m 文件中就可以添加:

-(void)sendAMesaage:(NSString*)message
{
  doWhatYouWant
    /*
  当B中触发了delegate事件之后,A也会被触发这里所写的事件,同时可以使用由B传来的值
  比如这个例子里传来的值 message 是就是前面我们自定义的那句@“世界属于三体!”
  */
}

使用delegation的通用步骤:

1.首先要创建一个delegate对象,使用protocol协议定义需要委托的方法接口

2.然后委托者要在自身文件里声明一个delegate对象

3.委托者回调delegate的协议方法(自身调用自身)

4.设置被委托者的delegate,用来被委托者调用协议方法(即delegate内的方法)

5.最后被委托者实现的delegate的协议方法,实现delegate

使用delegate的几个注意点:

1.声明的delegate对象的属性要使用weak,用来防止循环引用,因为对象的delegate持有对象本身。

2.要检查@option方法有没有实现,使用respondToselector:

3.命名最好以delegate的类名开头,然后加上should,will,did(通常)

(委托方法通常包括3种动词:should、will、did
should表示一个动作发生前,通常带有返回值,可以在动作发生之前改变对象状态。
will在动作发生前,委托可以对动作做出响应,但不带有返回值。
did在动作发生后做出的响应。)

你可能感兴趣的:(OC,IOS,macOS,objective-c,ios,mac,cocoa)