代理:
代理的特点
- 准确的说是一种软件设计模式
- iOS当中以@protocol形式提现
- 传递方式一对一
代理是一个概念,它更像是一种关系,我要做某一个事情,但我自己没办法抽出身去做这件事,我委托其他人帮我去做这件事。这个时候,这位其他人就是我的代理。
代理模式是一种消息传递方式,一个完整的代理模式包括:协议、委托对象、代理对象。
协议:用来指定代理双方可以做什么,必须做什么。
委托对象:根据协议指定代理对象需要完成的事,即调用协议中的方法。
代理对象:根据协议实现委托方需要完成的事,即实现协议中的方法。
我们发现,其实委托方的代理属性本质上就是代理对象自身,设置委托代理就是代理属性指针指向代理对象,相当于代理对象只是在委托方中调用自己的方法,如果方法没有实现就会导致崩溃。从崩溃的信息上来看,就可以看出来是代理方没有实现协议中的方法导致的崩溃。
而协议只是一种语法,是声明委托方中的代理属性可以调用协议中声明的方法,而协议中方法的实现还是由代理方完成,而协议方和委托方都不知道代理方有没有完成,也不需要知道怎么完成。
协议传值
看完了代理我就可以来看看协议传值了
协议传值就是从后一个界面向前一个界面啊传值,通过一个协议函数来完成从后向前传值的过程,又称为反向传值
@protocol BackControllerDelegate<NSObject>
//传值的方法一般都带一个或者多个参数
-(void)changeData:(NSString *)string
你需要在后页面中声明这个协议的代理,之后要用到这个协议的对象方法时,你需要用这个代理来充当对象
这里的属性关键字一般为assgin与nonatomic
@property (nonatomic, assign)
id<BackControllerDelegate> delegate;
你需要在前页面中实现该协议函数,请务必将后页面的.h文件添加到前页面的头文件,并且遵循此协议
@interface frontViewController : ViewController <BackControllerDelegate>
-(void)changeData:(NSString *)string
@end
我们已经完成了大部分的工作,接下来的步骤十分重要
在前页面中完成你想让他完成的任务(实现这个协议函数),这个时候我们就可以使用后页面传过来的值
我们不用在后页面中同样写一遍这个协议函数只需要在后页面中调用这个协议函数,并且将后页面的值传到这个数组里面
//在后页面中随便找一个地方调用
[_delegate changeData: str1];
这个时候,我们在后页面的值就以参数的方式传到了实现在前页面的协议函数中,这时候只要在前页面找一个类型来接受后页面传过来的值就行。
接下来在前页面执行这个函数的时候,后页面传过来的值将作为函数参数传进前页面,我们可以再将该参数传到我们前页面已有的数据中作为替换,我们便可以在前页面的其他函数中使用我们前页面原来的参数
属性传值
1.在后面的界面中创建一个属性用于保存前一个界面传过来的值。
2.在创建完后面的界面后,为属性赋值。
3. 在需要使用值的地方 使用属性记录的值
在后页面的头文件里添加一个用于接收前页面传过来的值的参数。
@property (nonatomic,copy) NSString *NameText;
在前页面的函数中推出后页面
BackController* backController = [[BackController alloc] init];
backontroller.NameText = _nameTextField.text;
//这样就把前页面中的值赋给后页面的属性NameText了
//接下来想在后页面怎么用这个值都随便用
//跳转控制器
[self presentViewController:bViewController animated:YES completion:nil];