美文网首页首页投稿(暂停使用,暂停投稿)
UITableViewCell多级折叠/树形列表

UITableViewCell多级折叠/树形列表

作者: guoxuzan | 来源:发表于2017-07-16 12:05 被阅读0次

先看效果

ZZFoldCell.gif

源码

https://github.com/guoxuzan/ZZFoldCell

原理分析

图中的行政区域是树形结构,但UITableView的Cell是队列形式,展开与折叠效果靠UITableView的Cell插入删除实现。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView beginUpdates];
    if (//要展开) {
        //子节点成为兄弟节点
        
        //insertRows
        [tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade];
    }else {//要折叠
        //兄弟节点变回子节点
        
        //deleteRows
        [tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade];
    }
    [tableView endUpdates];
}

树的操作靠Model配合data实现

@interface ZZFoldCellModel : NSObject

@property(nonatomic,copy) NSString *text;//cell展示内容
@property(nonatomic,copy) NSString *level;//节点级别
//...

@property(nonatomic,assign) NSUInteger belowCount;//子节点已经转为兄弟节点的个数
@property(nullable,nonatomic) ZZFoldCellModel *supermodel;//父节点
@property(nonatomic,strong) NSMutableArray<__kindof ZZFoldCellModel *> *submodels;//子节点

+ (instancetype)modelWithDic:(NSDictionary *)dic;//初始化
- (NSArray *)open;//返回并删除子节点
- (void)closeWithSubmodels:(NSArray *)submodels;//插入子节点

@end

具体实现

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    ZZFoldCellModel *didSelectFoldCellModel = self.data[indexPath.row];
    
    [tableView beginUpdates];
    if (didSelectFoldCellModel.belowCount == 0) {
        
        //Data
        NSArray *submodels = [didSelectFoldCellModel open];
        NSIndexSet *indexes = [NSIndexSet indexSetWithIndexesInRange:((NSRange){indexPath.row + 1,submodels.count})];
        [self.data insertObjects:submodels atIndexes:indexes];
        
        //Rows
        NSMutableArray *indexPaths = [NSMutableArray new];
        for (int i = 0; i < submodels.count; i++) {
            NSIndexPath *insertIndexPath = [NSIndexPath indexPathForRow:(indexPath.row + 1 + i) inSection:indexPath.section];
            [indexPaths addObject:insertIndexPath];
        }
        [tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade];
        
    }else {
        
        //Data
        NSArray *submodels = [self.data subarrayWithRange:((NSRange){indexPath.row + 1,didSelectFoldCellModel.belowCount})];
        [didSelectFoldCellModel closeWithSubmodels:submodels];
        [self.data removeObjectsInArray:submodels];
        
        //Rows
        NSMutableArray *indexPaths = [NSMutableArray new];
        for (int i = 0; i < submodels.count; i++) {
            NSIndexPath *insertIndexPath = [NSIndexPath indexPathForRow:(indexPath.row + 1 + i) inSection:indexPath.section];
            [indexPaths addObject:insertIndexPath];
        }
        [tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade];
    }
    [tableView endUpdates];
}

相关文章

网友评论

    本文标题:UITableViewCell多级折叠/树形列表

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