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ù)淳玩。
目錄
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ù)沒(méi)有直接聯(lián)系颂龙,僅用于輔助;
KCTableViewController是對(duì)于KCTableViewArrayDataSource纽什、KCTableViewDelegate措嵌、UITableView+KC使用的簡(jiǎn)單控制器封裝,用于輔助開發(fā)者快速創(chuàng)建使用LightweightUITalbeView的表格控制器芦缰;
UIView+KC是對(duì)UIView屬性的簡(jiǎn)單擴(kuò)展企巢,和當(dāng)前庫(kù)沒(méi)有直接聯(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ì)算行高,但是這種方式似乎并沒(méi)有iOS 7那么流暢奠衔,因?yàn)樗鼤?huì)多次計(jì)算Cell高度谆刨,效率似乎并沒(méi)有那么高。另外归斤,目前不支持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ì)齊
}];