协议传值
协议:
协议是一个方法签名的列表,在其中可以定义若干个方法。根据配置,遵守该协议的类会去实现这个协议中规定的若干个方法。
代理:
代理是一个概念,很难用一个名词去定义(如我们可以说协议其实就是一个方法列表)。它更像是一种关系,我要做某一个事情,但我自己不想去做这件事,我委托其他人帮我去做这件事。这个时候,这位其他人就是我的代理。
代理模式是一种消息传递方式,一个完整的代理模式包括:委托对象、代理对象和协议。
- 协议:用来指定代理双方可以做什么,必须做什么。
- 代理对象:根据协议指定代理对象需要完成的事,即调用协议中的方法。
- 代理对象:根据协议实现委托方需要完成的事,即实现协议中的方法。
代理传值:
第一步:在B控制器声明一份协议
//定义一个代理协议,B视图控制器的协议
@protocol VCSecondDelegate <NSObject>
//定义一个协议函数,改变A视图的背景颜色
- (void) changeColor:(UIColor*) color;
@end
第二步:在B视图中声明一个代理属性
//定义一个代理对象
//这个代理对象会执行协议函数
//通过代理对象来实现协议函数,达到代理对象改变本身属性的目的
//代理对象一定要实现代理协议
@property (assign, nonatomic) id<VCSecondDelegate> delegate;
第三步:在跳转回A视图的方法里写代理执行的方法
这里向视图B中添加了一个按钮,点击按钮触发按钮事件
//点击按钮时,触发按钮的事件
- (void) pressChange {
//代理对象调用事件函数
[_delegate changeColor:[UIColor purpleColor]];
}
第四步:在A视图控制器里签订代理协议
第五步:签订代理人
//点击屏幕空白处推出视图控制器B
- (void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
VCsecond* vcSecond = [[VCsecond alloc] init];
vcSecond.title = @"视图B";
//将当前的控制器作为代理对象赋值
vcSecond.delegate = self;
//推出视图控制器B
[self.navigationController pushViewController:vcSecond animated:YES];
}
第六步:实现代理方法
//通过代理的协议来改变背景颜色
- (void) changeColor:(UIColor *)color {
self.view.backgroundColor = color;
}
以上就是基本的协议传值的方法,传递的参数可以随自己的需求而做相应的调整。
属性传值
正传是利用属性传值(例如,把第一个页面中TextFiled中的text传到第二个页面中的一个TextField的text中)。
- 属性(property)是Objective-C的一项特性,用于封装对象中的数据。这一特性可以令编译器自动编写与属性相关的存取方法,并且保存为各种实例变量。
属性传值(从A视图传值到B视图中):
第一步:在B视图的 .h 文件中声明一个属性
利用这个NSString,可以将拿到的值赋给B中的Label、textfield等。
第二步:在A视图的 .h 文件中定义一个属性
第三步:在A视图的 .m 文件中进行给B视图的属性赋值并跳转控制器
- (void) press {
SecondViewController *bViewController = [[SecondViewController alloc]init];
bViewController.bText = aText;
[self presentViewController:bViewController animated:YES completion:nil];
}
在哪里需要跳转控制器,就在哪里调用。
第四步:在B.m中拿到传过来的值,被根据需要使用,比如:
UITextField *accoutTextField = [[UITextField alloc] init];
accoutTextField.text = bText;