美文网首页
单个代理实现一对多传值

单个代理实现一对多传值

作者: 小冰山口 | 来源:发表于2016-10-08 01:58 被阅读0次

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

    思路图如下:

    单个代理实现一对多传值

    最后实现效果:

    实现效果

    贡献一下源码, 跟老师的略有不同 :[源码连接]https://pan.baidu.com/s/1kU5qQ1p

    PS. 本人有若干成套学习视频, 包含Java, 数据结构与算法, iOS, 安卓, python, flutter等等, 如有需要, 联系微信tsaievan.

    相关文章

      网友评论

          本文标题:单个代理实现一对多传值

          本文链接:https://www.haomeiwen.com/subject/edhuyttx.html