本人有若干成套学习视频, 可试看! 可试看! 可试看, 重要的事情说三遍 包含Java
, 数据结构与算法
, iOS
, 安卓
, python
, flutter
等等, 如有需要, 联系微信tsaievan
.
代理一般是一对一的, 如果要一对多, 那么就是多播代理, 老师今天前半段在讲多播代理, 后面基本上就跟多播代理没啥关系了, 因为什么呢?
因为多了个中间层
所以最终遵守协议的只有一个, 那就是中间层, 所以不是 delegates, 依然是 delegate
假设我现在有三个 controller, 需要从一个 tableView(颜色数据的来源,就叫做 ColorListVC吧)中同时拿到它传过来的颜色数据, 然后赋值给各个控制器 view 的 backgroundColor, 怎么做?
思路很简单,
中间层与被代理者之间:
- 设置中间层, 中间层是一个单例, 这个单例遵守了ColorListVC的代理协议
中间层的.m 文件
#import "ColorTransferManager.h"
#import "ColorListTableViewController.h"
typedef void(^colorBlock)(UIColor *color);
@interface ColorTransferManager ()<ColorListTableViewControllerDelegate>
@end
@implementation ColorTransferManager
- (NSMutableArray *)blockArray
{
if (!_blockArray) {
_blockArray = [NSMutableArray array];
}
return _blockArray;
}
- (ColorListTableViewController *)colorListTableVC
{
UIStoryboard *board = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
_colorListTableVC = [board instantiateViewControllerWithIdentifier:@"ColorListTableViewController"];
_colorListTableVC.delegate = self;
return _colorListTableVC;
}
+ (instancetype)sharedManager
{
static id instanceType = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instanceType = [[ColorTransferManager alloc]init];
});
return instanceType;
}
- (void)transferColorListTableViewController:(ColorListTableViewController *)colorListTableViewController toAnotherViewControllerColor:(UIColor *)color
{
[self.blockArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
colorBlock block = (colorBlock)obj;
block(color);
}];
}
@end
- 当我点击了ColorListVC, 把颜色传递给中间层
colorListTableVC把颜色传递给中间层
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UIColor *color = self.tableArr[indexPath.row][@"Color"];
[self.delegate transferColorListTableViewController:self toAnotherViewControllerColor:color];
[self dismissViewControllerAnimated:YES completion:nil];
}
- 中间层实现代理协议,此时他已经拿到了颜色值, 只需要再将颜色值赋值给各个控制器就好
中间层与控制器之间:
- 用 block数组, 将这个数组作为单例的属性
- 在控制器的 viewDidLoad中, 就将这个数组添加 需要回调的 block, 那么三个控制器在创建的时候, 就都添加到数组中了
- 在中间层实现代理协议的时候, 遍历这个 block 数组,将颜色值传递给各个 block, 完成回调,那么每个控制器都拿到值了
思路图如下:
单个代理实现一对多传值最后实现效果:
实现效果贡献一下源码, 跟老师的略有不同 :[源码连接]https://pan.baidu.com/s/1kU5qQ1p
网友评论