Protocol - 協(xié)議 Delegate and DataSource

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

  • Delegate - 委托:一般回調(diào)方法函數(shù)兼蜈,will did 等
  • DataSource - 數(shù)據(jù)源:一般回調(diào)數(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 點(diǎn)擊事件,通過delegate 鏈接
- (void)testDelegateButtonAction:(UIButton *)button{
    
    if (self.delegate && [self.delegate respondsToSelector:@selector(didSelectButton:)]) {
        [self.delegate didSelectButton:button.tag - 8000];
    }
    
}
  • 3 使用 delegate 回調(diào)
// 注意使用<>
@interface ViewController ()<testDelegate>

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

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

簡單的 DataSource

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

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

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

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

@end

@interface TestDataSource : UIView
@property (nonatomic, weak) id<testDataSource> dateSource;
// 此處 我真不知道处面,怎么樣才能不調(diào)用,就實(shí)現(xiàn)布局菩掏。暫時只能類似tableView 的 reloadData 刷新UI魂角。
- (void)reloadData;
@end
  • 2 使用 dataSource 連接
- (void)reloadData{
    if (!self.dateSource) {
        return;
    }
    
    // 必選 實(shí)現(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];
        
        // 可選 實(shí)現(xiàn) dataSource
        if ([self.dateSource respondsToSelector:@selector(label:titleOfIndex:)]) {
            NSString *title = [self.dateSource label:label titleOfIndex:a];
            label.text = title;
        }
    }
}
  • 3 使用dataSource 回調(diào)
// 注意使用<>
@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 回調(diào)
- (NSInteger)numberOfLabels{
    return 3;
}
- (NSString *)label:(UILabel *)label titleOfIndex:(NSInteger)index{
    NSArray *arr = @[@"1",@"2",@"3"];
    return arr[index];
}

其他

對于 dataSource 還有點(diǎn) 疑問,有不對的地方智绸,希望指正批評野揪。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瞧栗,隨后出現(xiàn)的幾起案子斯稳,更是在濱河造成了極大的恐慌,老刑警劉巖迹恐,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挣惰,死亡現(xiàn)場離奇詭異,居然都是意外死亡系草,警方通過查閱死者的電腦和手機(jī)通熄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來找都,“玉大人唇辨,你說我怎么就攤上這事∧艹埽” “怎么了赏枚?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長晓猛。 經(jīng)常有香客問我饿幅,道長,這世上最難降的妖魔是什么戒职? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任栗恩,我火速辦了婚禮,結(jié)果婚禮上洪燥,老公的妹妹穿的比我還像新娘磕秤。我一直安慰自己乳乌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布市咆。 她就那樣靜靜地躺著汉操,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蒙兰。 梳的紋絲不亂的頭發(fā)上磷瘤,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天,我揣著相機(jī)與錄音搜变,去河邊找鬼采缚。 笑死,一個胖子當(dāng)著我的面吹牛挠他,可吹牛的內(nèi)容都是我干的仰担。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼绩社,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赂苗?” 一聲冷哼從身側(cè)響起愉耙,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拌滋,沒想到半個月后朴沿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡败砂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年赌渣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昌犹。...
    茶點(diǎn)故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡坚芜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出斜姥,到底是詐尸還是另有隱情鸿竖,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布铸敏,位于F島的核電站缚忧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏杈笔。R本人自食惡果不足惜闪水,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蒙具。 院中可真熱鬧球榆,春花似錦朽肥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至右钾,卻和暖如春蚁吝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背舀射。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工窘茁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脆烟。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓山林,卻偏偏與公主長得像,于是被迫代替她去往敵國和親邢羔。 傳聞我的和親對象是個殘疾皇子驼抹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容

  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,131評論 30 470
  • 1.屬性readwrite,readonly拜鹤,assign框冀,retain,copy敏簿,nonatomic 各是什么作...
    曾令偉閱讀 1,046評論 0 10
  • 最近一朋友正準(zhǔn)備跳槽明也,就從各處搜索整理一些基礎(chǔ),便于朋友復(fù)習(xí)惯裕,也便于自己復(fù)習(xí)查看. 1. 回答person的ret...
    smile麗語閱讀 1,730評論 0 7
  • iOS網(wǎng)絡(luò)架構(gòu)討論梳理整理中温数。。蜻势。 其實(shí)如果沒有APIManager這一層是沒法使用delegate的撑刺,畢竟多個單...
    yhtang閱讀 5,172評論 1 23
  • 1.內(nèi)存管理 2.單例的理解 3.post和get的區(qū)別 4.md5和base64是什么,有什么區(qū)別 5.簡單談?wù)?..
    coder_Wg閱讀 1,287評論 1 6