delegate協議實現一對多
阿新 • • 發佈:2019-01-04
代理一般是一對一的, 如果要一對多, 那麼就是多播代理;
多播代理只是多了箇中間層,但最終遵守協議的只有一個, 那就是中間層, 所以不是 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;
}];
最後實現效果:
實現效果