顺传值 (A控制器->到B控制器,将A控制器中的某些数据传递给B控制器)
- 上一级控制器传递给下一级控制器,直接能拿到下一级控制器,拿到之后,做什么事情都行
- 思路:
- 1.在B控制器中设置用于接收数据的属性
- 2.在从A控制器跳转到B控制器的同时,拿到B控制器的这个属性,进行赋值
- 如何拿到B控制器
- 通过纯代码的方式跳转的
- 通过纯代码的方式跳转的
//创建B控制器
UIViewController * Bvc = [[UIViewController alloc] alloc];
//将值赋值给B控制器的属性
Bvc.接收数据的属性 = Avc的某个数据值
//跳转
push的方式跳转 或者 modal的方式跳转
```
- 通过storyboard布局控制器实现控制器间跳转
通过方法prepareForSegue拿到要跳转到的下一个控制器
//在使用prepareForSegue方法前,一定要先通过performSegueWithIdentifier:方法指定要跳转到的控制器之间连线的标识Identifier
//根据标识执行指定的segue线
[self performSegueWithIdentifier:@"contactVC" sender:nil];
/**
performSegueWithIdentifier底层实现
1.根据标识到storyBoard查找有没有这根线.segue.
2.创建UIStoryboardSegue对象.
3.把当前控制器设置成它的源控制器segue.sourceViewController = self;
4.创建目标控制器(segue剪头指向的控制器),并且给segue.destinationViewController = segue剪头指向的控制器
5.segue准备完毕.[self prepareForSegue];
6.[segue perform]
[segue perform]底层
[segue.sourceViewController.navigationController pushViewController:segue.destinationViewController animated:YES]
*/
//prepareForSegue作用:在跳转之前,做一些准备工作,一般给跳转的下一个控制器传值
//prepareForSegue什么时候调用:在执行segue后,跳转之前调用
//通过prepareForSegue这个方法,可以拿到要跳转到的控制器"destinationViewController"和当前执行跳转的控制器"sourceViewController"
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
NSLog(@"%@",segue.sourceViewController);
//获取目标控制器
XMGContactVC_2 *contactVC = segue.destinationViewController;
//将需要传递的值传递给目标控制器的属性
contactVC.accountName = self.accountTextF.text;
}
逆传值(A控制器 <- B控制器,经B控制器中设置的数据反传回给A控制器)
- 下一级控制器传递给上一级控制器,用代理/通知/block。上一级控制器作为下一级的代理,监听下一级控制器的事情
- 代理思路
- 1.在B控制器中设置定义协议将要回传的数据设置为代理方法的参数,设置代理属性
- 2.在A控制器中获取B控制器,成为B控制器的代理,并实现代理方法,以拿取到数据
//通过代理的方法实现逆传值
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
//获取目标控制器
UIViewController * BVc = segue.destinationViewController;
//设置目标控制器的代理(逆传值)
BVc.delegate = self;
}
//实现代理方法,在代理方法中将B控制器的值传递到A控制器,这样就能拿到B控制器要回传的数据
- block思路
- 1.在B控制器.h文件中通过typedef定义一个block类型
示例 : typedef ZHJItem * (^editBlock)(ZHJItem *);
- 2.在B控制器中,通过block类型定义一个block属性
示例 : @property(nonatomic,copy) editBlock eBlock;
- 3.在A控制器中获取B控制器,并给B控制器的block类型的属性赋值,以实现回调
- 1.在B控制器.h文件中通过typedef定义一个block类型
//通过Block
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
ZHJEditVC * editVC = segue.destinationViewController;
//给编辑联系人控制器的block赋值,以实现回调
editVC.eBlock = ^ ZHJItem * (ZHJItem * item){
item = zhjItem;
[self.tableView reloadData];
return item;
}
- 通知思路
- 1.在B控制器中发出通知,并将要传递的数据以字典的形式传递出去
- 2.在A控制器中监听通知,通过实现监听通知中的方法,以获取数据
- B控制器发出通知
/** 发出通知 */
[[NSNotificationCenter defaultCenter] postNotificationName:@"editContact" object:nil userInfo:nil];
- A控制器监听通知,并实现通知中的方法
//接收添加联系人通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(addMember:) name:@"addMember" object:nil];
//实现监听添加联系人的方法
-(void)addMember:(NSNotification *)information
{
NSDictionary * dict = information.userInfo;
ZHJItem * zhjItem = dict[@"item"];
[self.itemArray addObject:zhjItem];
[self.tableView reloadData];
}