多界面传值
在切换不同的ViewController视图控制器时,通过某些方法将A视图控制器中想要的某些数据传输到B视图控制器中
一、 属性传值
属性传值最大的特点就是正向传值,即A页面传值给B页面
第一步:
需要传值给B就在B中定义一个属性(之所以在B.h中定义,是因为在B.h中声明的属性,在A的文件里新创建B视图控制器后也可以访问)
1、因为要将A中的值传给B,所以在B中定义个字符串类型的属性接收A传来的值。
@property (nonatomic,copy) NSString *sendText;
利用这个NSString,可以将拿到的值赋给B中的Label、textfield等
第二步
2、在A中给B的属性赋值并跳转
-(void)ASendMessageToB {
BViewController* bViewController = [[BViewController alloc] init];
//获取B就可以拿到B中的属性,并在A控制器里赋值了
bViewController.sendText = self.label.text; //这个就是需要传给B控制器的值,根据需要自己赋值
//跳转控制器,用到了presentViewController方法进行页面间的跳转
[self presentViewController:bViewController animated:YES completion:nil];
注意:需要在A中定义一个B视图控制器的对象,这样才能获取它的属性,从而在A视图控制器中改变B。
第三步:
B中的sendText此时已经接收到A传来的值,可以进行使用了。
二、 协议传值
协议传值最大的特点就是反向传值,即B页面传值给A页面
- 在B页面:
1、定义一个代理协议
2、定义协议函数
3、定义属性,属性需要定义一个协议(代理)对象,注意为id类型。
代理对象会执行协议函数,从而改变代理对象本身属性的目的。所以想要A页面实现什么,就定义什么样的协议函数。B无法直接改变A页面,因此通过代理来改变A页面。
- 在A页面:
1、继承B中定义的代理协议。
2、实现B中定义的协议函数。
3、将自己赋值给B的代理。
- 最后一步:
在B中代理对象调用事件函数,从而改变代理的属性,从而改变A。
具体代码实现如下:
在B视图中:
第一步:在B中定义代理协议
第二步:定义协议函数(想要代理实现什么就定义什么)
// 定义一个代理协议,B视图控制器的协议
@protocol VCSecondDelegate <NSObject>
//定义一个协议函数,改变A视图的背景颜色
- (void) changeColor:(UIColor*) color;
@end
第三步:在B中定义代理对象,注意代理对象为id类型,assign 为赋值型。
//定义一个代理对象
//这个代理对象会执行协议函数
//通过代理对象来实现协议函数,达到代理对象改变本身属性的目的
//代理对象一定要实现代理协议
@property (assign, nonatomic) id<VCSecondDelegate> delegate;
在A视图中:
第一步:继承代理协议
@interface VCfirst : UIViewController<VCSecondDelegate>
第二步:实现代理协议
//通过代理的协议来改变背景颜色
- (void) changeColor:(UIColor *)color {
self.view.backgroundColor = color;
}
第三步:将当前视图赋值给B的代理
//推出视图控制器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];
}
Last step
在B中:代理对象调用协议函数;
//代理对象调用事件函数
[_delegate changeColor:[UIColor purpleColor]];