最近项目相关,想用tableview展示出一个数据层次
这里用到了第三方框架RATreeView
其实网上有很多demo都详细介绍了用法,但是使用的都是静态数据,这里演示一下如何使用动态数据自动分层。
NameCardsTest.png请按照需求自行变更数据格式,这里只是最简单的示例。
title即每一行cell的标题,list是子层级内容。可以随意增加删减测试
使用RATreeView的代码这里就不提了,具体可以看demo。
这里放出最重要的递归代码,循环遍历从后台获取到的数据,并封层显示。
//加载数据
- (void)setData {
NSString *plistPath = [[NSBundle mainBundle]pathForResource:@"NameCardsTest" ofType:@"plist"];
NSMutableArray *dataArr = [[NSMutableArray alloc]initWithContentsOfFile:plistPath];
NSLog(@"%@",dataArr);//直接打印数据
[dataArr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSDictionary *dicLevel1 = (NSDictionary *)obj;
NSArray *arrList = (NSArray *) dicLevel1[@"list"];
if (arrList.count > 0) {
NameCardModel *nameCard = [NameCardModel objectWithNoChildren:dicLevel1[@"title"]];
[self recursiveAllChildrens:arrList withFather:nameCard];
[self.nameCardsArray addObject:nameCard];
}else {
NameCardModel *nameCard = [NameCardModel objectWithNoChildren:dicLevel1[@"title"]];
[self.nameCardsArray addObject:nameCard];
}
}];
}
//循环遍历
-(void)recursiveAllChildrens:(NSArray *)array withFather:(NameCardModel *)father {
[array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSDictionary *dic = (NSDictionary *)obj;
NSArray *arrList = (NSArray *) dic[@"list"];
if (arrList.count > 0) {
NameCardModel *nameCard = [NameCardModel objectWithNoChildren:dic[@"title"]];
[father addChild:nameCard];
[self recursiveAllChildrens:arrList withFather:nameCard];
}else {
NameCardModel *nameCard = [NameCardModel objectWithNoChildren:dic[@"title"]];
[father addChild:nameCard];
}
}];
}
最终效果
分级效果图.png这里我使用了两种cell,一种代表节点的部门,另一种代表部门下的职员。
有时在同一层级下,同时拥有部门和职员两种cell。
可以根据自己需求自行替换删减。
最后附上demo链接 demo
网友评论