上一篇文章【iOS】如何實現delegate鏈式或廣播調用介紹瞭如何實現delegate鏈,同時提供了一個例子,簡單的將UITableView的section抽象,使其擁有獨立的delegate。這裏對這示例進行完善,使其更具備複用性。git
Dispatch delegate to standalone section for UITableView.封裝UITableView 的 section, 使section有獨立的delegate和dataSource。github
IOS的UITableView組件,在複雜的場景下,常常會使用多個Section,每一個Section均可能有不一樣的header/cell/footer。若是想對Section的邏輯進行封裝,由於delegate和dataSource只能指向單獨的實例上,並非很方便,須要編寫一些額外的代碼,來分派UITableView的事件。segmentfault
CYMTableViewSection擴展了UITableView,提供將SectionID對應的事件獨立處理的能力。使用此擴展,將很容易對業務層的Section邏輯進行封裝。測試
如下例子介紹如何使用CYMTableViewSectionspa
實現兩個Section(MySection1和MySection2)code
/** 測試section1*/ @interface MySection1 : CYMTableViewSection<UITableViewDataSource> //只需繼承自CYMTableViewSection @end @implementation MySection1 -(instancetype)init { self = [super init]; if (self) { self.dataSource = self; } return self; } //處理UITableViewDataSource事件 //只會收到本Section實例對應的SectionId的事件 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *cellId = @"cellId"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: cellId]; } cell.textLabel.text = [NSString stringWithFormat:@"MySection1 | row %ld",(long)indexPath.row]; return cell; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return 3; } @end // 相似方式實現MySection2 ...
加入UITableVieworm
#import "UITableView+CYMSectionAdditions.h" @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //建立兩個Section加入tableview MySection1* sec1 = [[MySection1 alloc]init]; MySection2* sec2 = [[MySection2 alloc]init]; [_tabView addSection:sec1 reload:NO]; [_tabView addSection:sec2 reload:NO]; }
運行,查看結果繼承
本擴展依賴CYMDelegateChain事件