一.背景
在日常開發(fā)中,總少不了用tableView展示數(shù)據(jù),不過在稍微開始復雜的tableView中,總會包含多種樣式的cell,這需要我們自定義不同樣式的cell并在tableview中應用,本文要解決的就是上面提出的問題。
話不多說上代碼
#pragma mark tableViewDelegate
//celltypeArray此數(shù)組為實際需要展示的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的代理中通過調(diào)用cellIdIdentifierAtIndexpath來設置cell的重用id(就是不同樣式cell的類名)
而cellClassAtIndexpath則是通過枚舉值來判斷需要用的是哪個cell類
而關于cell,因為不知道復用取出來的是哪種類型的cell,我們就需要創(chuàng)建一個BaseCell類,讓所有的自定義cell繼承于該基類珊佣。
代碼如下:
#pragma mark 配置不同的cell樣式
//根據(jù)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;
}
//根據(jù)indexPath獲取cell重用id
-(NSString *)cellIdIdentifierAtIndexpath:(NSIndexPath *)indexPath{
return NSStringFromClass([self cellClassAtIndexpath:indexPath]);
}
通過定義枚舉變量來區(qū)別不同樣式的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類,然后添加一個新的枚舉變量與之對應,并添加到數(shù)組中即可蜗顽。
PS:這樣做只適用于cell數(shù)量不是特別多的時候,不然手動加cell也很麻煩,不過一般的如果cell的數(shù)量特別大的時候,樣式都是偏向于固定的樣式.
如果有更好的解決方案,歡迎交流~~~~~