美文网首页
OC 链式编程第三部分 - 复杂tableView的抽取

OC 链式编程第三部分 - 复杂tableView的抽取

作者: 风云雪獒 | 来源:发表于2018-11-13 18:03 被阅读0次

本篇文章是基于前两篇文章的扩充,这里没有采用链式编程,但是整体思想和第二篇类似。这里主要解决的是一个tableView包含多种类型的cell该怎么抽取的问题,本篇的代码也在github上传https://github.com/zfc769956454/ChainedDemo(下载下来运行ChainedDemo复杂tableView的抽离这个target)

image.png

1.介绍

这里主要介绍一下思想,对于复杂的tableView的抽取,采用的是cell和模型绑定的思想,有两个model类,ZFC_TableViewSectionSuperComplexModel(段模型,创建段模型的时候继承这它)和ZFC_TableViewRowSuperComplexModel(行模型,创建行模型的时候继承它)

2.核心代码

- (id)modelFromIndexPath:(NSIndexPath *)indexPath
{
    return (self.sectionCount == 1)?self.dataSource[indexPath.row]:((ZFC_TableViewSectionSuperComplexModel *)self.dataSource[indexPath.section]).sectionArray[indexPath.row];
}

- (void)setTableViewDelegateAndDataSource:(UITableView *)tableView{
    self.tableView       = tableView;
    tableView.delegate   = self;
    tableView.dataSource = self;
}

#pragma mark - tableViewDelegate
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    
    return (self.sectionCount == 1)?1:self.dataSource.count;
    
}

- (NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return (self.sectionCount == 1)?self.dataSource.count:((ZFC_TableViewSectionSuperComplexModel *)self.dataSource[section]).sectionArray.count;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    ZFC_TableViewRowSuperComplexModel * model = [self modelFromIndexPath:indexPath];
    return model.cellHeight;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    
    id model = [self modelFromIndexPath:indexPath];
    NSString *cellIdentifier = ((ZFC_TableViewRowSuperComplexModel *)model).cellIdentifier;
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (!cell) {
        [UITableViewCell registerTableView:tableView isNib:self.isCellNib cellClass:cellIdentifier];
        cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    }
    
    if(self.cellConfigBlock){
        self.cellConfigBlock(indexPath,cell,model);
    }
    return cell;
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    id model = [self modelFromIndexPath:indexPath];
    id cell  = [tableView cellForRowAtIndexPath:indexPath];
    
    if(self.cellDidSelectedBlock){
        self.cellDidSelectedBlock(indexPath, cell, model);
    }
}


- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    if(!self.headerIdetifier){
        return [[UIView alloc]init];
    }
    UITableViewHeaderFooterView* header = [tableView dequeueReusableHeaderFooterViewWithIdentifier:self.headerIdetifier];
    if (!header) {
        [UITableViewHeaderFooterView registerTabelView:tableView isNib:self.isSectionHeaderNib headerFooterClass:self.headerIdetifier];
        header = [tableView dequeueReusableHeaderFooterViewWithIdentifier:self.headerIdetifier];
    }
    if(self.headerConfigBlock){
        self.headerConfigBlock(section, header,self.dataSource[section]);
    }
    return header;
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    if(!self.headerIdetifier){
         return 0.0001f;
    }else{
        CGFloat headerHeight = 0.0001f;
        if(self.headerHeightBlock) {
            headerHeight = self.headerHeightBlock(section,self.dataSource[section]);
        }
        return headerHeight;
    }
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    if(!self.footerIdentifier){
        return [[UIView alloc]init];
    }
    UITableViewHeaderFooterView* footer = [tableView dequeueReusableHeaderFooterViewWithIdentifier:self.footerIdentifier];
    if (!footer) {
        [UITableViewHeaderFooterView registerTabelView:tableView isNib:self.isSectionFooterNib  headerFooterClass:self.footerIdentifier];
        footer = [tableView dequeueReusableHeaderFooterViewWithIdentifier:self.footerIdentifier];
    }
    
    if(self.footerConfigBlock){
        self.footerConfigBlock(section, footer,self.dataSource[section]);
    }
    return footer;
    
}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    
    if(!self.footerIdentifier){
           return 0.0001f;
    }else{
        CGFloat footHeight = 0.0001f;
        if(self.footerHeightBlock) {
            footHeight = self.footerHeightBlock(section,self.dataSource[section]);
        }
        return footHeight;
    }
}



- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    return self.isCanDelete;
}


- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if(self.sectionCount == 1 && self.dataSource.count > indexPath.row)
    {
        if(self.cellDeleteBlock){
             BOOL result = self.cellDeleteBlock(indexPath, self.dataSource[indexPath.row]);
             if(result){
                 [self.dataSource removeObjectAtIndex:indexPath.row];
                 [self deleteCellWithIndexPath:indexPath tableView:tableView];
             }else{
                 NSLog(@"删除失败");
                 [tableView reloadData];
             }
        }
    }else
    {
        ZFC_TableViewSectionSuperComplexModel *secModel = self.dataSource[indexPath.section];
        if(secModel.sectionArray.count > indexPath.row){
            if(self.cellDeleteBlock){
                BOOL result = self.cellDeleteBlock(indexPath, secModel.sectionArray[indexPath.row]);
                if(result){
                    [secModel.sectionArray removeObjectAtIndex:indexPath.row];
                    [self deleteCellWithIndexPath:indexPath tableView:tableView];
                }else{
                    NSLog(@"删除失败");
                    [tableView reloadData];
                }
            }
        }
    }
}

- (void)deleteCellWithIndexPath:(NSIndexPath *)indexPath tableView:(UITableView *)tableView
{
    [tableView beginUpdates];
    [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
    [tableView endUpdates];
}

这里就不再对代码做详细解释了,详细的内容在demo都有相应的解释。

3. 总结

最后,我再提一下链式创建UI和使用的小工具库ZFCChainedCreater,支持pod导入pod 'ZFCChainedCreater', '~> 1.0.2',github地址:https://github.com/zfc769956454/ZFCChainedCreater

相关文章

  • OC 链式编程第三部分 - 复杂tableView的抽取

    本篇文章是基于前两篇文章的扩充,这里没有采用链式编程,但是整体思想和第二篇类似。这里主要解决的是一个tableVi...

  • 像swift一样书写OC代码OC链式编程实践

    链式编程特点 链式编程 = 点语法 事物 串联 同样的hello word代码 OC和swift调用函数时候最大的...

  • iOS 链式编程

    链式编程是OC中一种很好的设计模式。框架中使用链式编程,会让框架使用者感觉写的代码更加美观简洁。 链式编程的效果 ...

  • OC 链式编程

    _ config.h _ View Example 既然已经决定,就勇敢的去吧。 决定吧

  • OC:链式编程

    概念: 链式编程:将多个业务逻辑(方法)通过“.”(点号)串联起来的一种代码风格,形似链条,故称链式编程。核心思想...

  • iOS:链式编程-collectionView组件化

    链式编程-tableview组件化:https://github.com/qw9685/ccTableView.g...

  • iOS链式语法深入实践

    要点 什么是链式语法 OC中的RAC、Masonry、SnapKit等链式编程的典型,大家应该都熟悉了Masonr...

  • OC-链式编程

    原理:用block作为返回值实现的链式 优点通过点语法直接调用 缺点虽然点语法调出方法,但是()和括号内的值需要手...

  • 链式文件生成器原理分析(一)

    在OC里面实现链式编程,可以使用返回调用者自身来实现。但是类有很多,每个类也有很多方法,假如要实现链式编程,则需要...

  • OC中的链式编程

    今天看到项目里边有一段代码 第一眼看上去感觉有点蒙,返回的是一个block,为什么可以直接去请求下一个方法呢?其实...

网友评论

      本文标题:OC 链式编程第三部分 - 复杂tableView的抽取

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