LightweightUITableView介紹

haiKe

源碼地址

LightweightUITalbeView項(xiàng)目是一個(gè)簡(jiǎn)化UITableView開發(fā)的輕量級(jí)類庫(kù),使用它你可以不用再編寫繁雜的數(shù)據(jù)源和代理方法,可以不用再手動(dòng)維護(hù)可變高度的Cell行高,所有的這一切均有類庫(kù)自動(dòng)實(shí)現(xiàn),讓開發(fā)者只需要關(guān)注具體的業(yè)務(wù)。

屏幕快照 2017-02-25 上午12.36.16.png

目錄

LightweightUITalbeView 包含整個(gè)輕量級(jí)UITableview所需要的內(nèi)容,可以直接copy到項(xiàng)目中使用; LightweightUITalbeViewDemo 用于演示LightweightUITalbeView庫(kù)的使用;

說(shuō)明

KCTableViewArrayDataSource和KCTableViewDelegate用于給UIViewController中的UITableView的dataSource和delegate瘦身,也是LightweightUITalbeView的核心,二者將數(shù)據(jù)源和代理方法從控制器中解放出來(lái),并提供了一些便捷方法用于快速配置數(shù)據(jù);
UITableView+KC 用于實(shí)現(xiàn)自動(dòng)行高擴(kuò)展處理,理論上來(lái)說(shuō)和KCTableViewArrayDataSource、KCTableViewDelegate可以分開使用,但是為了設(shè)置更加方便建議配合使用;
KCTableViewArrayDataSourceWithCommitEditingStyle用于處理可編輯Cell,KCTableViewArrayDataSource會(huì)根據(jù)屬性設(shè)置動(dòng)態(tài)調(diào)用,外界無(wú)需直接調(diào)用;
UITableViewCell+KC是對(duì)于UITableViewCell的擴(kuò)展,僅用于輔助操作;
KCTableViewCell是對(duì)UITableViewCell的簡(jiǎn)單封裝,方便配置Cell背景和設(shè)置間距,一般用于frame控制行高的情況,和當(dāng)前庫(kù)沒有直接聯(lián)系,僅用于輔助;
KCTableViewController是對(duì)于KCTableViewArrayDataSource、KCTableViewDelegate、UITableView+KC使用的簡(jiǎn)單控制器封裝,用于輔助開發(fā)者快速創(chuàng)建使用LightweightUITalbeView的表格控制器;
UIView+KC是對(duì)UIView屬性的簡(jiǎn)單擴(kuò)展,和當(dāng)前庫(kù)沒有直接聯(lián)系,僅用于輔助;
總之,KCTableViewArrayDataSource、KCTableViewDelegate、UITableView+KC三個(gè)類是給UITableView瘦身的核心,理論上其他輔助類如果不需要均可以去掉(需要開發(fā)者簡(jiǎn)單修改使用的輔助方法,但是可行)。

示例

1. 控制器瘦身

借助于KCTableViewArrayDataSource和KCTableViewDelegate對(duì)象代理控制器視圖成為數(shù)據(jù)源和代理,避免冗余的數(shù)據(jù)源和代理方法,開發(fā)人員只需要關(guān)注屬配置和必要的代理實(shí)現(xiàn),并且二者均使用block實(shí)現(xiàn),避免同一類方法分散到各處造成維護(hù)困擾。并且二者在命名方式上完全和原來(lái)的數(shù)據(jù)源方法、代理方法相對(duì)應(yīng),開發(fā)起來(lái)幾乎零學(xué)習(xí)成本。另外為了便于開發(fā),這里除了對(duì)應(yīng)方法的block還提供了很多可以簡(jiǎn)化開發(fā)人員的方法,例如對(duì)于"- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath "這個(gè)數(shù)據(jù)源方法,則除了提供對(duì)應(yīng)的“cellForRowAtIndexPathBlock”這個(gè)block之外,通常情況下如果只有一組數(shù)據(jù)、一種cell樣式還可以直接使用"cellBlock"來(lái)簡(jiǎn)化數(shù)據(jù)配置,這個(gè)方法除了提供cell對(duì)象參數(shù)還提供了與之對(duì)應(yīng)的數(shù)據(jù)項(xiàng)避免開發(fā)人員自己去數(shù)組中取出對(duì)應(yīng)的模型(更多配置可以參考代碼和具體的注釋說(shuō)明)。
如下示例中,由于在KCTableViewArrayDataSource中默認(rèn)實(shí)現(xiàn)了返回分組數(shù)和行數(shù)的實(shí)現(xiàn),如果僅僅包含一組數(shù)據(jù)可以不用實(shí)現(xiàn)分組數(shù)據(jù)源方法,而行數(shù)的實(shí)現(xiàn)KCTableViewArrayDataSource默認(rèn)會(huì)返回配置的數(shù)組的個(gè)數(shù),因此開發(fā)人員僅僅需要配置"cellForRowAtIndexPathBlock"來(lái)配置數(shù)據(jù)展示(事實(shí)上下面的代碼中直接使用了默認(rèn)的構(gòu)造方法來(lái)完成了這個(gè)block的配置,代碼更加簡(jiǎn)化)。同樣的道理,KCTableViewDelegate則使用block來(lái)代理代理方法。

** 配置數(shù)據(jù)源 **

//數(shù)據(jù)源方法通過(guò)block實(shí)現(xiàn)
_dataSource = [[KCTableViewArrayDataSource alloc] initWithData:self.data
                 cellBlock:^(UITableViewCell *cell, NSString *dataItem, NSIndexPath *indexPath) {
                   cell.textLabel.text = dataItem;
                 }];
//更多數(shù)據(jù)源配置
//[_dataSource setNumberOfRowsInSectionBlock:^NSUInteger(NSArray * data, NSInteger section) {
//            
//}];

** 配置代理 **


//代理方法通過(guò)block實(shí)現(xiàn)
[_delegate setSelectRowAtIndexPathBlock:^(id cell, NSIndexPath *indexPath) {
    NSString *controllerName = [NSString stringWithFormat:@"KCAutoHeightTableViewController%ld",indexPath.row + 1];
    UIViewController *autoHeightController = [NSClassFromString(controllerName) new];
    [weakSelf.navigationController pushViewController:autoHeightController animated:YES];
}];
//更多代理配置
//[_delegate setHeightForRowAtIndexPathBlock:^CGFloat(NSIndexPath *indexPath) {
//            
//}];

2. 自動(dòng)計(jì)算Cell高度

從iOS 8開發(fā)人員才能利用"self-sizing cell"自動(dòng)計(jì)算行高,但是這種方式似乎并沒有iOS 7那么流暢,因?yàn)樗鼤?huì)多次計(jì)算Cell高度,效率似乎并沒有那么高。另外,目前不支持iOS 7還是不太現(xiàn)實(shí)的,或者說(shuō)你還想要兼容更低版本。LightweightUITableView提供了一種更加通用和高效的解決方案。使用UITableView+KC 會(huì)讓Cell行高計(jì)算更加方便(無(wú)論你是使用frame還是AutoLayout布局),再配合上KCTableViewDelegate這種實(shí)現(xiàn)則更加簡(jiǎn)潔,使用是直接配置UITableView的autoCellHeight為YES即可(當(dāng)然建議配置estimatedRowHeight)。UITableView+KC內(nèi)部會(huì)自動(dòng)在空閑時(shí)間預(yù)計(jì)算Cell高度,并且自動(dòng)維護(hù)行高不會(huì)多次計(jì)算行高。 在下面的實(shí)例中,僅僅通過(guò)幾行代碼即實(shí)現(xiàn)了Cell行高的計(jì)算。

//如果使用KCTableViewDelegate只需要配置UITableView的autoCellHeight屬性為YES即可(當(dāng)然在定義Cell中需要實(shí)現(xiàn)height方法)
self.tableView.estimatedRowHeight = 300.0;
self.tableView.autoCellHeight = YES;
self.dataSource.cellClass = [KCCardTableViewCell1 class];
self.data = [[KCPersonService requestPersons] mutableCopy];
[self.dataSource setCellBlock:^(KCCardTableViewCell1 *cell, id dataItem, NSIndexPath *indexPath) {
    cell.person = dataItem;
}];
[self.delegate setWillDisplayCellBlock:^(UITableViewCell *cell, NSIndexPath *indexPath) {
    cell.seperatorPinToSupperviewMargins = YES;//分割線兩端對(duì)齊
}];

引自:
http://upload-images.jianshu.io/upload_images/1799927-5ae449a08dbb3dc9.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

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

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容