【IOS】【UITableView】抽象section,使其擁有獨立的delegate

上一篇文章【iOS】如何實現delegate鏈式或廣播調用介紹瞭如何實現delegate鏈,同時提供了一個例子,簡單的將UITableView的section抽象,使其擁有獨立的delegate。這裏對這示例進行完善,使其更具備複用性。git

CYMTableViewSection@github

Dispatch delegate to standalone section for UITableView.封裝UITableView 的 section, 使section有獨立的delegate和dataSource。github

WHY

IOS的UITableView組件,在複雜的場景下,常常會使用多個Section,每一個Section均可能有不一樣的header/cell/footer。若是想對Section的邏輯進行封裝,由於delegate和dataSource只能指向單獨的實例上,並非很方便,須要編寫一些額外的代碼,來分派UITableView的事件。segmentfault

WHAT

CYMTableViewSection擴展了UITableView,提供將SectionID對應的事件獨立處理的能力。使用此擴展,將很容易對業務層的Section邏輯進行封裝。測試

HOW

如下例子介紹如何使用CYMTableViewSectionspa

  1. 實現兩個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
    ...
  2. 加入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];
    }
  3. 運行,查看結果繼承

    demo.png?raw=true

依賴

本擴展依賴CYMDelegateChain事件

相關文章
相關標籤/搜索