美文网首页
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的抽取

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