传统的代理和block传值一般都是单层传递,想要深入的传递值,一般做法就是通过通知跨类传递。代理、block要想深层传递值会比较麻烦,需要在传递的每一个类上都需要申明,本文将实现一种比较简单的深入传递。代码地址
一.代理模式深入传递
只需将控制器一层层传递到指定类
1.控制器:代理接收者
// 代理传值 ViewController1 *vc = [[ViewController1 alloc] init]; // 传入代理的控制器对象 vc.delegateVC = self; [self.navigationController pushViewController:vc animated:YES];
-(void)agentFunc1{ NSLog(@"代理回调"); }
2.控制器:将控制器传递给下一层
ViewController2 *vc = [[ViewController2 alloc] init]; vc.delegateVC = self.delegateVC; [self.navigationController pushViewController:vc animated:YES];
3.控制器:目标控制器
申明代理对象
@property(nonatomic,weak)id<AgentDelegate> delegate;
将代理对象设置为传递进来的控制器
self.delegate = self.delegateVC;
执行代理方法
[self.delegate agentFunc1];
二.block深入传值
和上面有的类似,只需将block变量一层层传递到指定类
1.控制器:block接收者
ViewController1 *vc = [[ViewController1 alloc] init]; // 传入代理的控制器对象 vc.viewBlock = ^{ NSLog(@"block回调"); }; [self.navigationController pushViewController:vc animated:YES];
2.控制器:将block属性传递给下一级
ViewController2 *vc = [[ViewController2 alloc] init]; vc.viewBlock = self.viewBlock; [self.navigationController pushViewController:vc animated:YES];
3.控制器:目标控制器
self.viewBlock();