WBTableView 展示
使用理由
系統(tǒng)的UITableView非常強大麻捻,大家也非常熟悉。但是<嫒铩3鹾瘛!它太繁瑣了遍略,每次使用都需要遵守<UITableViewDelegate,UITableViewDataSource>惧所,之后寫二個基本代理:numberOfRowsInSection,cellForRowAtIndexPath绪杏,代碼不僅多而且重復下愈,純粹浪費時間。
所以經(jīng)過之前對block的理解封裝了一個基礎(chǔ)的UITableView蕾久,不敢說功能多強大势似,最少你不必花費寫很多重復代碼,節(jié)約時間僧著。
思路
能不能寫一個公共的類來存放包括初始化UITableView履因,代理方法實現(xiàn)等重復的代碼,然后把方法里需要單獨處理的內(nèi)容使用block傳遞到外界盹愚,之后只需操作block里的不同方法實現(xiàn)達到目的栅迄。
文件解析:
WBTableView.h
- 定義了一個枚舉用于判斷是使用系統(tǒng)默認的UITableViewCell還是使用不帶xib自定義的tableViewCell注冊的;
- 之后定義了兩個block用于接收不同類調(diào)用tableView在代理方法處理方式不同的內(nèi)容操作皆怕;
- 暴露系統(tǒng)UITableView便于其他項目進行優(yōu)化或其他方法調(diào)用;
- initWithFrame:方法用于初始化自定義的tableView毅舆,registerTableViewCellByClassName:用于注冊綁定cell,其實這兩個方法可以放到一起愈腾,但是那樣一個參數(shù)就太多了憋活,也不能太懶了是不;
- selectTableViewCell:方法其實就相當于tableView的didSelectRowAtIndexPath方法虱黄,只是以后寫選中方法直接在block里編寫就OK了悦即。
WBTableView.m
- 定義identifier標識符,定義dataSourceArray數(shù)據(jù)源,定義cell方法回調(diào)函數(shù)WBDataSourceBlock,定義cell選中回調(diào)函數(shù)WBTableViewCellSelectBlock,定義系統(tǒng)UITableViewCell,定義delegate用于確定tableView要放在哪個視圖或控制器里;
- 初始化自定義tableView的時候需要初始化數(shù)據(jù)源、cell創(chuàng)建的block、delegate所屬父視圖辜梳;
3.單獨使用一個方法初始化系統(tǒng)UITableView粱甫,同時通過初始化自定義tableView傳過來的delegate父視圖判斷類型之后放置到父視圖上; - registerTableViewCellByClassName:方法類似系統(tǒng)UITabelView的register方法冗美,不過是把系統(tǒng)的兩種register和默認注冊cell的方法合并成這個方法魔种,之后根據(jù)WBRegisterMode類型進行注冊類型判斷;
5.在cellForRowAtIndexPath代理方法里使用_dataSourceBlock調(diào)用下粉洼。
6.同理在didSelectRowAtIndexPath代理方法里使用_tableViewCellSelectBlock調(diào)用节预,之后外界調(diào)用selectTableViewCell方法使用block回調(diào)。
注意:
這只是個最初的版本属韧,沒有加入可變高度的支持安拟,也沒有head的自定義等,可能還會存在內(nèi)存泄漏等亂七八糟的問題宵喂。所以最好在使用的時候能自己看下糠赦,試著理解下,畢竟這些是最基礎(chǔ)的知識構(gòu)成锅棕,完全沒用任何復雜技術(shù)拙泽。
使用說明
- 把WBTableView文件夾拖到項目中;
- 導入頭文件
#import "WBTableView.h"
; - 使用
- (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style dataSourceArray:(NSArray *)dataSourceArray delegate:(id)delegate dataSourceBlock:(WBDataSourceBlock)dataSourceBlock
方法初始化WBTableView; - 使用
- (void)registerTableViewCellByClassName:(NSString *)className registerMode:(WBRegisterMode)registerMode identifier:(NSString *)identifier
注冊自定義UITableViewCell; - (可選)選中某行cell需要調(diào)用
- (void)selectTableViewCell:(WBTableViewCellSelectBlock)tableViewCellSelectBlock
方法;
更新
- 新增tableView的組數(shù)個數(shù)自定義裸燎;
- 新增cell行高自定義顾瞻;
例:
/**
初始化tableView
*/
- (void)setupTableView {
//創(chuàng)建數(shù)據(jù)源數(shù)據(jù)
NSMutableArray *muArray = [[NSMutableArray alloc] init];
for(int i = 0 ; i < 10; i++) {
[muArray addObject:[NSString stringWithFormat:@"這是第%d行",i+1]];
}
self.dataSourceArray = [muArray copy];
//初始化自定義tableView
_wbTableView = [[WBTableView alloc] initWithFrame:CGRectMake(0, 50, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height - 50) style:UITableViewStylePlain dataSourceArray:_dataSourceArray delegate:self dataSourceBlock:^(id wbCell, id wbData) {
WB1TableViewCell *cell = (WB1TableViewCell *)wbCell;
cell.data = wbData;
}];
//注冊自定義tableViewCell
[_wbTableView registerTableViewCellByClassName:@"WB1TableViewCell" registerMode:WBRegisterModeClass identifier:@"identifier"];
//tableViewCell選中
[_wbTableView selectTableViewCell:^(id wbCell, id wbData) {
NSLog(@"data = %@",wbData);
}];
//新增:
//設(shè)置section個數(shù)
_wbTableView.sectionNumber = 3;
//設(shè)置cell行高
_wbTableView.cellHeight = 88;
}
如果有任何問題或者好建議歡迎修正和討論,謝謝德绿!~
最后附上WBTableView Demo地址:GitHub