多vc之间的传值
1)正向传值
当AVC推出BVC时,a给b传值叫做正向传值
2)正向传值实现步骤
step1:bvc要提供一个公开的属性
//公开一个属性,用于接收其他类出入的字符串
@property(nonatomic,copy)NSString *message;
step2:avc在推出bcc之前,为bvc公开的属性赋值
//1.创建要推出的bvc的实例
BViewController *bvc = [[BViewController
alloc]initWithNibName:@"BViewController"
bundle:nil];
//2.为bvc公开的属性赋值
bvc.message =
self.textField.text;
//3.推出
[self
presentViewController:bvc
animated:YES
completion:nil];
step3:bvc在一个合适的时机,显示avc传来的值
- (void)viewWillAppear:(BOOL)animated{
[super
viewWillAppear:animated];
self.label.text =
self.message;
}
3)反向传值(回传)
AVC推出BVC,在b返回到a的过程中,b给a传值叫做反向传值
解决方案一:
step1:为avc增加用于接收返回的数据的属性
//公开一个属性,用于接收B回传回来的值
@property(nonatomic,copy)NSString *backMessage;
step2:为bvc增加用于接收avc引用的属性
//公开一个属性,用来存储avc的引用
@property(nonatomic,strong)AViewController
*avc;
step3:avc在推出bvc之前,将自己赋值给bvc公开的属性
#import "AViewController.h"
#import "BViewController.h"
@interface
AViewController ()
@property (weak,
nonatomic) IBOutlet
UILabel *label;
@end
@implementation AViewController
- (void)viewDidLoad
{
[super
viewDidLoad];
}
- (void)viewWillAppear:(BOOL)animated{
[super
viewWillAppear:animated];
self.label.text =
self.backMessage;
}
- (IBAction)gotoBVC:(id)sender {
BViewController *bvc = [[BViewController
alloc]initWithNibName:@"BViewController"
bundle:nil];
//avc将自己的引用传给了bvc
bvc.avc =
self;
[self
presentViewController:bvc
animated:YES
completion:nil];
}
step4:bvc在dismiss之前,将文本框的值赋值给存储的avc
step5:avc在viewWillAppear中显示回传的值
@interface
BViewController ()
@property (weak,
nonatomic) IBOutlet
UITextField *textField;
@end
@implementation BViewController
- (void)viewDidLoad
{
[super
viewDidLoad];
}
- (IBAction)gobackAVC:(id)sender {
self.avc.backMessage =
self.textField.text;
[self
dismissViewControllerAnimated:YES
completion:nil];
}
解决方案二:委托
/*
1.定义协议
1)协议命名:类名+Delegate
2)
方法的命名:尽量体现发消息的时机
3)方法的参数:第一个参数一定是委托方自己,后面的参数可以为委托方发给代理方的辅助信息
2.定义一个属性,用于存储代理方的引用
3.在合适的时机给代理方发消息
*/
/*
在回传值的过程中,InputViewController为委托方,AViewController为代理方
1.遵守协议
2.实现方法
3.设置自己为代理方
*/