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

单个代理实现一对多传值

作者: 小冰山口 | 来源:发表于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.

相关文章

  • 单个代理实现一对多传值

    本人有若干成套学习视频, 可试看! 可试看! 可试看, 重要的事情说三遍 包含Java, 数据结构与算法, iOS...

  • iOS简单block的传值

    一直对block传值理解不深,觉得很复杂,所有遇见传值的问题大多数还是用代理传值,但是代理传值还得注册协议实现代理...

  • iOS中界面传值的几种方式

    1.属性传值 属性传值适用于顺序传值,从前面的界面传值给后面的界面。 2.代理传值 用代理的方式实现界面间传值稍微...

  • 请简述页面传值都有哪些实现方式。

    请简述页面传值都有哪些实现方式。 代理、block、通知、属性传值、单例传值、NSUserDefault (1)属...

  • ios常用的三种传值方式

    iOS中有多种方案可以实现页面之间的传值,例如:属性传值、代理传值、block传值、单例传值...。常用的三种传值...

  • ios-代理的基本使用

    代理的基本用法 界面由A->B 再由B->A 的时候,需要B的值传值给A以下是用代理的方法实现, 代理和传值是先...

  • iOS开发知识点总结(三)

    1.页面传值都有哪些实现方式 代理、block、通知、属性传值、单例传值、NSUserDefault 2.简述深拷...

  • 界面传值

    1正向传值 2反向传值(代理) 在b界面 :1声明协议和方法(方法不实现)2定义代理属性 通知代理 a面遵守协议。...

  • IOS 四种传值

    1. 代理传值 特点:一般用于反向传值,正向传值也可以,只不过不常用而已;一对一 从 TwoVC 页面传值到 On...

  • Swift常用的界面传值(属性传值、协议传值、闭包传值)

    1、属性传值 属性传值多用于正向传值(A->B) 2、代理传值 代理传值多用于反向传值(B->A) 3、闭包传值 ...

网友评论

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

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