美文网首页
工厂模式下多样式 Cell 的 TableView

工厂模式下多样式 Cell 的 TableView

作者: 王技术 | 来源:发表于2018-12-21 22:33 被阅读0次

    开发中常遇到
    一个 TableView 有多种不用样式的 cell
    为了解决这种问题
    我是这么操作的 :


    多样式 Cell 的 TableView

    这里是我之前的工厂模式的一篇文章
    使用工厂模式
    TableView 作为工厂
    cell 作为产品

    具体实现方式 :

    1 先做产品

    HXBaseTableViewCell 是所有产品 cell 的抽象类
    它只有一个方法
    这个方法也是所有具体产品 cell 应该实现的方法
    因为每个 cell 都需要 setModel 来获得需要展示的数据

    - (void)setModel:(HXBaseModel *)model {
            
    }
    

    上面的 gif 图中有三个产品cell
    分别是
    titleCell, imageCell, blendCell
    在代码中分别是 :
    HXTitleStyleTableViewCell
    HXImageStyleTableViewCell
    HXBlendStyleTableViewCell
    他们都继承抽象产品类 HXBaseTableViewCell
    也都实现了 setModel: 方法

    2 然后介绍一下数据 Model

    每一个 cell 产品对应一个 model
    model 中存放着这个 cell 所需要的所有数据
    示例代码中的 cell 只有 image 和 title 这两个元素
    实际开发中可能会复杂得多
    HXBaseModel 是所有 Model 的父类
    他拥有所有 model 共有的属性

    另外
    因为我们的 Tableview 是按照组的形式展示
    所以我构建了一个组的 Model
    每个属性的用途:

    @interface HXCellGroupModel : NSObject
    // 存放该组所有 cell 对应的数据
    @property (nonatomic, strong) NSArray<HXBaseModel *> *dataArray;
    // 这组 header 的高度
    @property (nonatomic, assign) CGFloat sectionHeaderHeight;
    // 这组 header 的 title
    @property (nonatomic, copy) NSString *sectionHeaderTitle;
    // 这组 cell 的Identifier
    @property (nonatomic, copy) NSString *cellIdentifier;
    
    @end
    
    

    然后我们可以构建一些假数据
    实际开发中这些数据应该来自网络

            HXTitleModel *titleModel1 = [HXTitleModel createWithTitle:@"titleCell----01" subTitle:@"我是 titleCell"];
            HXTitleModel *titleModel2 = [HXTitleModel createWithTitle:@"titleCell----02" subTitle:@"我是 titleCell"];
            HXTitleModel *titleModel3 = [HXTitleModel createWithTitle:@"titleCell----03" subTitle:@"我是 titleCell"];
            HXCellGroupModel *titleCellGroup = [[HXCellGroupModel alloc] init];
            titleCellGroup.dataArray = @[titleModel1, titleModel2, titleModel3];
            titleCellGroup.sectionHeaderHeight = 40;
            titleCellGroup.sectionHeaderTitle = @"titleCell";
            titleCellGroup.cellIdentifier = @"HXTitleStyleTableViewCell";
            
            HXImageModel *imageModel1 = [HXImageModel createWithImage:@"image1" title:@"imageCell----01" subTitle:@"我是 imageCell"];
            HXImageModel *imageModel2 = [HXImageModel createWithImage:@"image2" title:@"imageCell----02" subTitle:@"我是 imageCell"];
            HXImageModel *imageModel3 = [HXImageModel createWithImage:@"image3" title:@"imageCell----03" subTitle:@"我是 imageCell"];
            HXCellGroupModel *imageCellGroup = [[HXCellGroupModel alloc] init];
            imageCellGroup.dataArray = @[imageModel1, imageModel2, imageModel3];
            imageCellGroup.sectionHeaderHeight = 40;
            imageCellGroup.sectionHeaderTitle = @"imageCell";
            imageCellGroup.cellIdentifier = @"HXImageStyleTableViewCell";
            
            HXBlendModel *blendModel1 = [HXBlendModel createWithImage:@"image4" title:@"blendCell----01" subTitle:@"我是 blendCell"];
            HXBlendModel *blendModel2 = [HXBlendModel createWithImage:@"image5" title:@"blendCell----02" subTitle:@"我是 blendCell"];
            HXBlendModel *blendModel3 = [HXBlendModel createWithImage:@"image6" title:@"blendCell----03" subTitle:@"我是 blendCell"];
            HXCellGroupModel *blendCellGroup = [[HXCellGroupModel alloc] init];
            blendCellGroup.dataArray = @[blendModel1, blendModel2, blendModel3];
            blendCellGroup.sectionHeaderHeight = 40;
            blendCellGroup.sectionHeaderTitle = @"blendCell";
            blendCellGroup.cellIdentifier = @"HXBlendStyleTableViewCell";
    
            _dataArray = @[titleCellGroup, imageCellGroup, blendCellGroup];
    

    3 最后是工厂 TableView

    首先按照惯例
    需要把所有的 cell 注册一下

        [self.tableView registerNib:[UINib nibWithNibName:@"HXBlendStyleTableViewCell" bundle:nil] forCellReuseIdentifier:@"HXBlendStyleTableViewCell"];
        [self.tableView registerNib:[UINib nibWithNibName:@"HXImageStyleTableViewCell" bundle:nil] forCellReuseIdentifier:@"HXImageStyleTableViewCell"];
        [self.tableView registerNib:[UINib nibWithNibName:@"HXTitleStyleTableViewCell" bundle:nil] forCellReuseIdentifier:@"HXTitleStyleTableViewCell"];
    

    数据源方法实现一下 :

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return self.dataArray.count;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return self.dataArray[section].dataArray.count;;
    }
    

    最后是重点
    生产 cell 的方法 :

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        HXCellGroupModel *groupModel = self.dataArray[indexPath.section];
        HXBaseTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:groupModel.cellIdentifier forIndexPath:indexPath];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        [cell setModel:groupModel.dataArray[indexPath.row]];
        return cell;
    }
    
    

    因为我们在 groupModel 中存储了 cell 的 Identifier
    在生产方法中只需要从 groupModel 中读取 Identifier 就可以了
    读取到什么 Identifier 就会去生产对应的 cell
    生产出的 cell 用抽象产品类 HXBaseTableViewCell 指针指向
    接下来读取 groupModel 中这个 cell 对应的数据
    调用cell 的 setModel: 方法给 cell 数据
    整个生产过程
    并不知道生产了什么样子的 cell
    也并不知道给了 cell 个啥 model
    一切操作根据 groupModel 中的数据来搞
    是什么样数据
    就搞什么样的 cell
    感觉很到位!

    本文代码

    感谢阅读
    你的点赞是我写作的唯一动力

    相关文章

      网友评论

          本文标题:工厂模式下多样式 Cell 的 TableView

          本文链接:https://www.haomeiwen.com/subject/tocmkqtx.html