Protocol - 協(xié)議 Delegate and DataSource

簡述:都是回調,貌似區(qū)別并不是很大。

  • Delegate - 委托:一般回調方法函數(shù),will did 等
  • DataSource - 數(shù)據(jù)源:一般回調數(shù)據(jù)
  • 但是使用時感覺并沒有特別大的區(qū)別,觀察系統(tǒng)的UITableView - Delegate 和 DataSource
 // DDelegate
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;

// DataSource
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
    - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;

簡單舉例 Delegate

  • 1 寫protocol 協(xié)議
// 簡單的協(xié)議
@protocol testDelegate <NSObject>
- (void)didSelectButton:(NSInteger)index;
@end

// weak 的delegate
@interface TestDelegate : UIView
@property (nonatomic, weak) id<testDelegate> delegate;
@end
  • 2 使用 delegate 連接

- (instancetype)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self) {
        
        CGFloat height = CGRectGetHeight(frame) / 3;
        
        // 舉例 使用多個 button。
        for (NSInteger a = 0; a < 3; a ++) {
            UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
            button.frame = CGRectMake(0, height * a, CGRectGetWidth(frame), height);
            [button addTarget:self action:@selector(testDelegateButtonAction:) forControlEvents:UIControlEventTouchUpInside];
            button.backgroundColor = [UIColor redColor];
            button.tag = 8000 + a;
            [self addSubview:button];
        }
    }
    return self;
}

// 自身的 buttons 點擊事件,通過delegate 鏈接
- (void)testDelegateButtonAction:(UIButton *)button{
    
    if (self.delegate && [self.delegate respondsToSelector:@selector(didSelectButton:)]) {
        [self.delegate didSelectButton:button.tag - 8000];
    }
    
}
  • 3 使用 delegate 回調
// 注意使用<>
@interface ViewController ()<testDelegate>

// 注意 delegate = self;
    TestDelegate *testelegateView = [[TestDelegate alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    testelegateView.delegate = self;
    [self.view addSubview:testelegateView];

// delegate 回調方法
- (void)didSelectButton:(NSInteger)index{
    // do something 簡單的delegate 就這么 結束了。
}

簡單的 DataSource

跟 Delegate 我覺得好像是一樣的 流程。

  • 1 寫協(xié)議
// 與 delegate 一樣,只是名字不一樣罷了?
@protocol testDataSource <NSObject>

// 必須實現(xiàn):
@required
- (NSInteger)numberOfLabels;

// 可選實現(xiàn)
@optional
- (NSString *)label:(UILabel *)label titleOfIndex:(NSInteger)index;

@end

@interface TestDataSource : UIView
@property (nonatomic, weak) id<testDataSource> dateSource;
// 此處 我真不知道,怎么樣才能不調用,就實現(xiàn)布局。暫時只能類似tableView 的 reloadData 刷新UI。
- (void)reloadData;
@end
  • 2 使用 dataSource 連接
- (void)reloadData{
    if (!self.dateSource) {
        return;
    }
    
    // 必選 實現(xiàn) dataSource
    NSInteger number = [self.dateSource numberOfLabels];
    CGFloat height = CGRectGetHeight(self.bounds) / number;
    
    for (NSInteger a = 0; a < number; a ++) {
        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, height * a, CGRectGetWidth(self.bounds), height)];
        [self addSubview:label];
        
        // 可選 實現(xiàn) dataSource
        if ([self.dateSource respondsToSelector:@selector(label:titleOfIndex:)]) {
            NSString *title = [self.dateSource label:label titleOfIndex:a];
            label.text = title;
        }
    }
}
  • 3 使用dataSource 回調
// 注意使用<>
@interface ViewController ()<testDataSource>

// 注意使用 dataSource = self 與 reloadData
    TestDelegate *testelegateView = [[TestDelegate alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    testelegateView.dateSource = self;
    [self.view addSubview:testelegateView];
    [testelegateView reloadData];


// dataSource 回調
- (NSInteger)numberOfLabels{
    return 3;
}
- (NSString *)label:(UILabel *)label titleOfIndex:(NSInteger)index{
    NSArray *arr = @[@"1",@"2",@"3"];
    return arr[index];
}

其他

對于 dataSource 還有點 疑問,有不對的地方,希望指正批評。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,619評論 30 472
  • 1.屬性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作...
    曾令偉閱讀 1,130評論 0 10
  • 最近一朋友正準備跳槽,就從各處搜索整理一些基礎,便于朋友復習,也便于自己復習查看. 1. 回答person的ret...
    smile麗語閱讀 1,904評論 0 7
  • iOS網絡架構討論梳理整理中。。。 其實如果沒有APIManager這一層是沒法使用delegate的,畢竟多個單...
    yhtang閱讀 5,490評論 1 23
  • 1.內存管理 2.單例的理解 3.post和get的區(qū)別 4.md5和base64是什么,有什么區(qū)別 5.簡單談談...
    coder_Wg閱讀 1,353評論 1 6

友情鏈接更多精彩內容