1. 场景还原
如图,三种cell的tableView:
三种cell.gif后台返回的json数据如下:
{
"result": true,
"data": {
"list": [ {
"type": 0,
"title": "第一种cell,图片在左边",
"image": "number_1"
}, {
"type": 1,
"title": "第二种cell,图片在右边",
"image": "number_2"
}, {
"type": 2,
"title": "第三种cell,图片在中间",
"image": "number_3"
}, {
"type": 0,
"title": "老子反手就是一个呵呵哒🙄",
"image": "number_1"
}]
},
"msg": "ok",
"code": 200,
"executed": "0.0320830345"
}
类似于这种同种model,多种cell的tableView相信不少开发者在实际项目开发中都遇到过,我分享一下我的做法,谨以抛砖引玉。
2. 文件组织
2.1 什么是抽象基类?
只用于继承、不用于实例化的类。
3. 类族
类族,就是将子类的实现细节隐藏在抽象基类中。(个人理解)
这是抽象基类cell代码:
+ (instancetype)cellWithType:(CQClassClusterType)type {
// 根据type创建对应的子类cell
switch (type) {
case CQClassClusterTypeA:
{
return [[CQClassClusterCellA alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CQClassClusterCellAReuseID];
}
break;
case CQClassClusterTypeB:
{
return [[CQClassClusterCellB alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CQClassClusterCellBReuseID];
}
break;
case CQClassClusterTypeC:
{
return [[CQClassClusterCellC alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CQClassClusterCellCReuseID];
}
break;
}
}
使用:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
CQClassClusterModel *model = self.dataArray[indexPath.row];
CQClassClusterBaseCell *cell = [tableView dequeueReusableCellWithIdentifier:model.cellReuseID];
if (!cell) {
// 类族模式
cell = [CQClassClusterBaseCell cellWithType:model.type];
}
[cell setModel:model];
return cell;
}
4. demo
https://github.com/CaiWanFeng/iOS_Storage
demo所在位置:
5. 欢迎讨论
讨论来简书啊,其他地方转载的可能看不到。
网友评论
“类族是将抽象基类的实现细节隐藏在子类中”这句话跟我demo里的子类cell重写基类cell的setModel方法表现一致;
“调用者只需关心抽象基类的api”跟我demo里的基类cell的cellWithType一致;
“而实现则是放在被继承的子类中”这句话还是在子类cell重写基类cell的setModel方法中体现。
如果你的理解真的与我相反,那肯定是你的理解出了问题,不信你可以去看下《Effective Objective-C 2.0》的第9条。
都不是一个跨区