1. 程式人生 > >delegate協議實現一對多

delegate協議實現一對多

代理一般是一對一的, 如果要一對多, 那麼就是多播代理

多播代理只是多了箇中間層,但最終遵守協議的只有一個, 那就是中間層, 所以不是 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;

      }];

最後實現效果:


實現效果