UITableView多层级列表

众所周知,UITableView只有sectionrow,是没有多层级概念的。所以,想要做到像OA系统中的多级部门管理列表,就需要自己手动实现。

原理

tableView作为一个容器,每一行一个cell,点击一行cell时,去查找当前cell下的模型(model)的子模型数组,插入到当前模型下面,展示在界面上。隐藏时,再查找子模型数组删除。

数据模型

@property (nonatomic, copy  ) NSString       * title;
@property (nonatomic, assign) NSInteger      level;
@property (nonatomic, strong) NSMutableArray * subItems;
@property (nonatomic, assign) BOOL           isSubItemOpen;
@property (nonatomic, assign) BOOL           isSubCascadeOpen;

isSubItemOpen标记当前cell展开或隐藏;isSubCascadeOpen标记该子菜单是否要在其父菜单展开时自动展开;level标记当前cell层级。

cell插入

#pragma mark - insert
- (NSArray *)insertMenuIndexPaths:(MyItem *)item {
    
    NSArray *arr;
    [treeItemsToInsert removeAllObjects];
    [self insertMenuObject:item];
    arr = [self insertIndexsOfMenuObject:treeItemsToInsert];
    return arr;
}

//查找item下的所有需要插入的模型,临时保存到treeItemsToInsert数组中
- (void)insertMenuObject:(MyItem *)item {
    
    if (item == nil) {
        return ;
    }
    
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[self.tableViewData indexOfObject:item] inSection:0];
    
    MyItem *childItem;
    for (int i = 0; i < [item.subItems count]; i++) {
        childItem = item.subItems[i];
        [self.tableViewData insertObject:childItem atIndex:indexPath.row + i +1];
        [treeItemsToInsert addObject:childItem];
        item.isSubItemOpen = YES;
    }
    
    for (int i = 0; i < [item.subItems count]; i++) {
        childItem = item.subItems[i];
        
        if (childItem .isSubCascadeOpen) {
            [self insertMenuObject:childItem];
        }
        
    }
}
//返回tableView需要插入的数组(indexPath路径)
- (NSArray *)insertIndexsOfMenuObject:(NSMutableArray *)array {
    
    NSMutableArray *arr = [NSMutableArray array];
    for (MyItem *item in array) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[self.tableViewData indexOfObject:item] inSection:0];
        [arr addObject:indexPath];
    }
    return arr;
}

cell删除

#pragma mark - delete
- (NSArray *)deleteMenuIndexPaths:(MyItem *)item {
    
    NSArray * arr;
    [treeItemsToRemove removeAllObjects];
    [self deleteMenuObject:item];
    arr = [self deleteIndexsOfMenuObject:treeItemsToRemove];
    return arr;
}

//查找需要删除的模型数组
- (void) deleteMenuObject:(MyItem *)item {
    if (item == nil)
    {
        return ;
    }
    
    MyItem *childItem;
    for (int i = 0; i<[item.subItems count] && item.isSubItemOpen ; i++) {
        childItem = [item.subItems objectAtIndex:i];
        [self deleteMenuObject:childItem];
        
        [treeItemsToRemove addObject:childItem];
        // [tableViewData removeObject:childItem];
        
    }
    
    item.isSubItemOpen = NO;
    
    return ;
}

//返回需要删除的indexpatn数组
- (NSArray *) deleteIndexsOfMenuObject:(NSMutableArray *)arr {
    
    NSMutableArray *mutableArr;
    mutableArr = [NSMutableArray array];
    NSMutableIndexSet * set;
    set = [NSMutableIndexSet indexSet];
    for (int i = 0; i < [treeItemsToRemove count]; i++)
    {
        MyItem * item;
        item = [treeItemsToRemove objectAtIndex:i];
        NSIndexPath *path = [NSIndexPath indexPathForRow:[self.tableViewData indexOfObject:item] inSection:0];
        [mutableArr addObject:path];
        [set addIndex:path.row];
    }
    
    [self.tableViewData removeObjectsAtIndexes:set];
    
    return mutableArr;
}

cell点击

#pragma mark - UITableViewDelegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    TableViewCell *cell = (TableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
    MyItem *item = cell.item;
    
    if (item.isSubItemOpen) {
        //删除
        NSArray *arr = [self.menuData deleteMenuIndexPaths:item];
        [self.tableView deleteRowsAtIndexPaths:arr withRowAnimation:UITableViewRowAnimationBottom];
    } else {
        //插入
        NSArray *arr = [self.menuData insertMenuIndexPaths:item];
        [self.tableView insertRowsAtIndexPaths:arr withRowAnimation:UITableViewRowAnimationBottom];
    }
}

代码下载地址https://github.com/iosyueshen/DYHMultiLevelMenu.git

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,403评论 4 61
  • ps4主机 slim 家用游戏机 广东ip可以直接筛选广州 找到店铺 唐朝电玩 广州 浏览此指定产品1min 按自...
    布撸布撸x阅读 1,130评论 0 0
  • 【周末轻松话题】 小灶的朋友们,放学别走,我要狠狠夸夸你。(欢迎刷屏,欢迎自由发挥) 小灶的朋友们好多都好牛,怎么...
    单双眼星人阅读 1,495评论 0 0
  • 天色微明,我悄悄的起来,轻轻的穿上衣服。没有开灯,没有一点声响。蹑手蹑脚的打开房门,生怕吵醒熟睡的你。 ...
    张雷1980阅读 5,870评论 2 2
  • 在web和移动端开发时,常常会调用服务器端的restful接口进行数据请求,为了调试,一般会先用工具进行测试,通过...
    MacLinuXP阅读 9,554评论 0 0

友情链接更多精彩内容