delegate协议实现一对多
来源:互联网 发布:画logo的软件 编辑:程序博客网 时间:2024/06/10 08:14
代理一般是一对一的, 如果要一对多, 那么就是多播代理;
多播代理只是多了个中间层,但最终遵守协议的只有一个, 那就是中间层, 所以不是 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{//因为vc是用storybored实现的,所以要从storybored中获取vc; UIStoryboard *board = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; _colorListTableVC = [board instantiateViewControllerWithIdentifier:@"ColorListTableViewController"];//id为storyboredID _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, 完成回调,那么每个控制器都拿到值了
思路图如下:
vc中的代码实现:
[kColorTransferManager.blockArrayaddObject:^(UIColor *color){
self.view.backgroundColor = color;
}];
最后实现效果:
阅读全文
0 0
- delegate协议实现一对多
- 在Objective-C中实现Delegate:协议
- 自定义Delegate(协议)的实现与继承
- 自定义Delegate(协议)的实现与继承
- ibatis 实现一对多代码
- hibernate一对多的实现
- hibernate一对多的实现
- Hibernate 注解 实现一对多
- hibernate注解实现一对多
- IOS--UIScrollView delegate 协议-
- 协议(protocol) & 委托(delegate)
- OC-协议delegate
- 一对多关系用 Hibernate 实现
- Hibernate使用List实现一对多映射
- ibatis 实现一对一和一对多
- hibernate 双向一对多的实现
- hibernate注解方式实现一对多映射
- hibernate 双向一对多的实现
- USACO——Closing the farm
- 关于ImageLoader must be init with configuration before using问题解决
- 26. Remove Duplicates from Sorted Array
- 关于Servlet的几个小问题
- WIN32学习——资源学习
- delegate协议实现一对多
- 图(二叉树)邻接矩阵(数组描述)
- 树与二叉树
- 解决utunbu无法在线播放音乐的问题
- 按学生成绩进行升序排列
- Highcharts简介
- Eclipse+Pydev插件安装搭建Python开发环境 没有配置好,会报错Project interpreter not specified
- 【unity学习笔记】unity优化DrawCall 及动态批处理的约束
- 异步请求时,JSON.stringify()导致data参数中加号(+)丢失