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];}
  • 中间层实现代理协议,此时他已经拿到了颜色值, 只需要再将颜色值赋值给各个控制器就好
中间层与控制器之间:
  1. 用 block数组, 将这个数组作为单例的属性
  2. 在控制器的 viewDidLoad中, 就将这个数组添加 需要回调的 block, 那么三个控制器在创建的时候, 就都添加到数组中了
  3. 在中间层实现代理协议的时候, 遍历这个 block 数组,将颜色值传递给各个 block, 完成回调,那么每个控制器都拿到值了

思路图如下:


单个代理实现一对多传值
           vc中的代码实现:

     [kColorTransferManager.blockArrayaddObject:^(UIColor             *color){

        self.view.backgroundColor = color;

      }];

最后实现效果:


实现效果

原创粉丝点击