[OC] Delegate的使用
建立两个页面 A 和 B,我们假设他们的文件名为ControllerA,ControllerB
由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
接下来在 ControllerB.m 的文件中写入:
-(void)whenSomethingHappened //controllerB中的事件被触发,比如你可以让一个按钮的点击事件为这个函数 {
NSString *message = @"世界属于三体!"; if([_delegate respondsToSelector:@selector(sendAMessage:)]) { //如果协议响应了sendMessage:方法 [ _delegate sendAMessage:message ];//通知执行协议方法 } }
接下来,在 ControllerA.m 文件中 增加delegate的定义:
@interface ControllerA()<ControllerBDelegate>
@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 是就是前面我们自定义的那句@“世界属于三体!”
*/ }