如果对您有所帮助,请赐予我一颗小小的星星
将UITableView的数据源和代理分别封装为CCTableViewDataSource和CCTableViewDelegate,分别依赖于数据管理类CCTableDataItem CCTableDataItem类以流的方式载入布局的信息,代码方面更加直观,写法也更加方便
源码中有很详细的注释,使用起来也很快,核心思想是讲数据的显示和高度的计算交给Cell,HeaderView,FooterView来做,以Cell为例,只需要继承CCBaseTableViewCell,并且重写
+ (CGFloat)cellHeightForData:(id)data;
- (void)bindData:(id)data;
同时,CCBaseTableViewCell还提供了动态计算Cell高度的方法,使用方法如下:
@implementation ExampleDynamicHeightCell
static ExampleDynamicHeightCell *staticCell = nil;
+ (CGFloat)cellHeightForData:(id)data
{
return [self dynamicCellHeightForStaticCell:staticCell
data:data
cellClass:[ExampleDynamicHeightCell class]
tableViewWidth:CGRectGetWidth([UIScreen mainScreen].bounds)
fromXib:YES];
}
@end
cellHeightForData方法根据传入的数据来返回Cell的高度,bindData用来显示数据,同时Cell还有2个可选方法可以选择性的重写
- (void)cellWillDisplayByData:(id)data;
- (void)cellDidEndDisplayByData:(id)data;
分别对应UITableView的
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath*)indexPath
然后在视图控制器中创建数据管理类以及代理类和数据源类
- (CCTableDataItem *)dataItem
{
if (!_dataItem) {
_dataItem = [CCTableDataItem dataItem];
}
return _dataItem;
}
- (CCTableViewDelegate *)ccDelegate
{
if (!_ccDelegate) {
_ccDelegate = [CCTableViewDelegate delegateWithDataItem:self.dataItem];
}
return _ccDelegate;
}
- (CCTableViewDataSource *)ccDataSource
{
if (!_ccDataSource) {
_ccDataSource = [CCTableViewDataSource dataSourceWithItem:self.dataItem];
}
return _ccDataSource;
}
并将数据源和代理分别设置给TableView,并让TableView注册Cell,此方案提供了新的类别方法用来快速的注册Cell
self.tableView.delegate = self.ccDelegate;
self.tableView.dataSource = self.ccDataSource;
[self.tableView registerNibCellClasses:@[[ExampleCell class],
[ExampleDynamicHeightCell class]]];
CCTableViewDelegate是可高度定制的,分别针对所有的代理方法提供了block来进行控制,例如:
[self.ccDelegate setDidSelectRowAtIndexPath:^(UITableView *tableView, NSIndexPath *indexPath, id rowData, NSString *cellClassName) {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
if ([rowData isKindOfClass:[ExampleCellItem class]]) {
ExampleCellItem *cellItem = (ExampleCellItem *)rowData;
NSLog(@"该单元格对应的数据源标题为:%@\n对应的按钮标题为:%@",cellItem.titleString,cellItem.buttonString);
}else if ([rowData isKindOfClass:[ExampleDynamicHeightCellItem class]])
{
ExampleDynamicHeightCellItem *dynamicCellItem = (ExampleDynamicHeightCellItem *)rowData;
NSLog(@"点击的是动态高度单元格,该单元格对应的数据源内容为:\n%@",dynamicCellItem.dataString);
}
}];
最后可以来进行数据的绑定了,将数据和相关的Cell绑定在一起
- (void)bindData
{
[self.dataItem clearData];
//创建无代理的区头区尾
[self.dataItem addHeaderNibClass:[ExampleHeaderView class]
headerDataItem:[self.dataManager exampleHeaderData]
footerNibClass:[ExampleFooterView class]
footerDataItem:[self.dataManager exampleFooterData]];
[self.dataItem addCellClass:[ExampleCell class] dataItem:[self.dataManager exampleCellData]];
//创建有代理的区头区尾
[self.dataItem addHeaderNibClass:[ExampleHeaderView class]
headerDataItem:[self.dataManager exampleHeaderDataWithDelegate]
headerDelegate:self footerNibClass:[ExampleFooterView class]
footerDataItem:[self.dataManager exampleFooterDataWithDelegate]
footerDelegate:self];
[self.dataItem addCellClass:[ExampleCell class] dataItems:[self.dataManager exampleCellDatasWithDelegate] delegate:self];
//创建动态高度区
[self.dataItem addHeaderNibClass:[ExampleHeaderView class]
headerDataItem:[self.dataManager exampleDynamicHeaderData]
footerNibClass:[ExampleFooterView class]
footerDataItem:[self.dataManager exampleDynamicFooterData]];
[self.dataItem addCellClass:[ExampleDynamicHeightCell class] dataItems:[self.dataManager exampleDynamicDatas]];
[self.tableView reloadData];
}
当你使用这种方案,封装好了一个通用的Cell和headerView,FooterView以后,你会发现你开发一个页面会变得非常高效