-
协议(protocol):就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现。
-
代理(delegate):根据协议实现委托方需要完成的事,即实现协议中的方法。
协议(protocol)、代理(delegate)常用见于代理模式。代理模式是一种消息传递方式,一个完整的代理模式包括:委托对象、代理对象和协议。
代理模式一般情况下是用来跨对象传值的。
情境描述:
ViewControllerA跳转到ViewControllerB,当点击返回时需ViewControllerB 想ViewControllerA传递一个字符串"我是一个传值字符串"
,并由ViewControllerA进行NSLog打印。
情景实现:
-
1.ViewControllerB声明协议和协议方法
-------------------------------------------------
// ViewControllerB.h
#import <UIKit/UIKit.h>
#1. 新建一个协议,协议的名字一般是由“类名+Delegate”
@protocol ViewControllerBDelegate <NSObject>
// 代理传值方法
- (void)sendValue:(NSString *)value;
@end
@interface ViewControllerB : UIViewController
#2. 委托代理人,代理一般需使用弱引用(weak)
@property (weak, nonatomic) id<ViewControllerBDelegate> delegate;
@end
-------------------------------------------------
// ViewControllerB.m
#import "ViewControllerB.h"
@interface ViewControllerB ()
@property (strong, nonatomic) IBOutlet UITextField *textField;
@end
@implementation ViewControllerB
- (IBAction)backAction:(id)sender {
if ([_delegate respondsToSelector:@selector(sendValue:)]) { // 如果协议响应了sendValue:方法
[_delegate sendValue:@"我是一个传值字符串"]; // 通知执行协议方法
}
[self.navigationController popViewControllerAnimated:YES];
}
@end
-------------------------------------------------
-
2.ViewControllerA设置为ViewControllerB的代理,ViewControllerA遵循协议,并实现协议方法
//ViewControllerA.m
#import "ViewControllerA.h"
#import "ViewControllerB.h"
#4.遵循协议
@interface ViewController() <ViewControllerBDelegate>
@end
@implementation ViewControllerA
- (void)jumpTo ViewControllerB {
ViewControllerB *vc = segue.destinationViewController;
#3.设置代理
[vc setDelegate:self];
[self.navigationController pushViewController: vc animated:YES];
}
# 5.这里实现B控制器的协议方法
- (void)sendValue:(NSString *)value {
NSLog(@"%@", value);
}
@end
运行结果
2020-01-04 10:32:34.288075+0800 DeleteDemo[2006:407016] 我是一个传值字符串
网友评论