一.背景
在日常开发中,总少不了用tableView展示数据,不过在稍微开始复杂的tableView中,总会包含多种样式的cell,这需要我们自定义不同样式的cell并在tableview中应用,本文要解决的就是上面提出的问题。
话不多说上代码
#pragma mark tableViewDelegate
//celltypeArray此数组为实际需要展示的cell
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return self.celltypeArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//通过cellIdIdentifierAtIndexpath获取重用id
EntertainmentBaseCell *cell = [tableView dequeueReusableCellWithIdentifier:[self cellIdIdentifierAtIndexpath:indexPath]];
if(!cell){
//通过cellClassAtIndexpath:indexPath获取cell类名,所有的cell都是需要继承EntertainmentBaseCell的
Class cls = [self cellClassAtIndexpath:indexPath];
cell = [[cls alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[self cellIdIdentifierAtIndexpath:indexPath]];
}
[self bindCell:cell index:indexPath];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
if(self.cellModel){
cell.cellModel =self.cellModel;
}
return cell;
}
在tableview的代理中通过调用cellIdIdentifierAtIndexpath来设置cell的重用id(就是不同样式cell的类名)
而cellClassAtIndexpath则是通过枚举值来判断需要用的是哪个cell类
而关于cell,因为不知道复用取出来的是哪种类型的cell,我们就需要创建一个BaseCell类,让所有的自定义cell继承于该基类。
代码如下:
#pragma mark 配置不同的cell样式
//根据indexPath获取cell类型
-(Class)cellClassAtIndexpath:(NSIndexPath *)indexpath{
cellType type = [self.celltypeArray[indexpath.row] longValue];
switch (type) {
case CELLTYPEUSERINFO:
return [NewEntertainmentHeaderCell class];
break;
case CELLTYPEGB:
return [NewEntertainmentGBRemindCell class];
break;
case CELLTYPEVIP:
return [EntertainmentVipCell class];
break;
case CELLTYPEADV:
return [EntertainmentAdvCell class];
break;
case CELLTYPEVIDEO:
return [EntertainmentVideoCell class];
break;
case CELLTYPECollection:
return [EntertainmentCollectionCell class];
break;
case CELLTYPEGUESS:
return [EntertainmentGuessCell class];
break;
}
return nil;
}
//根据indexPath获取cell重用id
-(NSString *)cellIdIdentifierAtIndexpath:(NSIndexPath *)indexPath{
return NSStringFromClass([self cellClassAtIndexpath:indexPath]);
}
通过定义枚举变量来区别不同样式的cell类
typedef NS_ENUM(NSInteger,cellType){
CELLTYPEUSERINFO,
CELLTYPEGB,
CELLTYPEVIP,
CELLTYPEADV,
CELLTYPEVIDEO,
CELLTYPECollection,
CELLTYPEGUESS
};
-(NSMutableArray *)celltypeArray{
if(!_celltypeArray){
_celltypeArray = [@[@(CELLTYPEUSERINFO),@(CELLTYPEGB),@(CELLTYPEVIP),@(CELLTYPEVIDEO),@(CELLTYPECollection),@(CELLTYPEADV),@(CELLTYPEGUESS)]mutableCopy];
}
return _celltypeArray;
}
这样可以在你需要添加一个新的样式cell的时候,只需要自定义cell类,然后添加一个新的枚举变量与之对应,并添加到数组中即可。
PS:这样做只适用于cell数量不是特别多的时候,不然手动加cell也很麻烦,不过一般的如果cell的数量特别大的时候,样式都是偏向于固定的样式.
如果有更好的解决方案,欢迎交流~~~~~