代理一般都是用于反向传值的,但是有时候可能项目的需要做正向传值,做法如下:
首先谁要传值谁就是委托,1.委托要做的事情就是写协议;2.拥有一个遵守该协议的delegate成员;3.使用这个delegate触发回调。
代码如下:
1.写协议
@protocol PassValue <NSobject>
- (void)PassValue:(NSString *)name;
@end
2.成员属性
@property (nonatomic,weak) id delegate;
3.触发回调,传值
ThreeViewController *ThreeViewController = [[ThreeViewController alloc] init];
self.delegate=ThreeViewController;//设置代理
if ([self.delegate respondsToSelector:@selector(PassValue:)]) {
[self.delegate PassValue:@"哈哈"];
}
[self presentViewController:ThreeViewController animated:YES completion:^{
}];
在这里要注意了:
1.如果⚠️Class 'xxxxxViewController' does not conform to protocol 'PassValue'
证明你没有实现协议里面的方法,只要你实现协议的方法了就不会有警告了;
2.如果⚠️Assigning to 'id' from incompatible type 'xxxxxxViewController *__strong'
证明你没有遵守协议,如果你遵守了协议还有这个警告,(ps,当你遵守了协议,运行的结果没影响,可以不用理会,但是如果你还是想把警告去掉,你就如下去做:)
在你接收值的控制器.h文件中这样修改:
#import "SecondViewController.h"
@interface ThreeViewController : SecondViewController
SecondViewController是要传值的控制器;这样警告就会消失了;
委托写完了,现在写到代理了。
代理要做的事情:1.遵守协议;2.设置代理;3,实现代理方法
代码如下:1遵守协议
@interface ThreeViewController ()<PassValue>
设置代理上面写了,这里就不需要了;
3.实现代理方法
- (void)backPassValue:(NSString *)name
{
NSLog(@"-------%@",name);
}
如果是用代理方向传值,一样的道理。。。。。。