一个树状结构列表封装

简介

运用了二叉树思想封装的树状结构列表框架,Demo实现效果如下:

重要事项

构建一个树结构,需要后台返回一些必要的参数:

参数解释
ID节点唯一标识
parentID父节点唯一标识,即为父节点ID
sortOrder子节点序号,用于排序

框架结构

本框架主要包含四大类:

类名解释作用备注
ZKTreeNode节点数据模型将原始数据转化为节点数据模型
ZKTreeManager数据管理类
(核心类)
1.构建树结构
2.提供对数据的增、删、改、查
非线程安全
ZKTreeListViewCell单元视图类组成树状列表使用需继承此类
ZKTreeListView主视图类将数据操作可视化线程安全

使用步骤

1.初始化并设置其代理:

// 实例化
- (instancetype)initWithFrame:(CGRect)frame style:(ZKTreeListViewStyle)style NS_DESIGNATED_INITIALIZER;
// 注册自定义cell,必须继承自<ZKTreeTableViewCell> 
- (void)registerClass:(nullable Class)cellClass forCellReuseIdentifier:(NSString *)identifier;
复制代码

2.实现代理方法:

- (ZKTreeListViewCell *)treeListView:(ZKTreeListView *)listView cellForNode:(ZKTreeNode *)node atIndexPath:(NSIndexPath *)indexPath;
复制代码

3.构建节点数据模型:

- (instancetype)initWithID:(NSString *)ID parentID:(NSString *)pID sortOrder:(NSInteger)order data:(id)data;
复制代码

ZKTreeNode主要属性:

  • data:数据模型
  • level:节点所处等级,若后台未返回,内部可自动计算
  • rowHeight:即为cell行高,框架目前暂不支持自适应行高,建议提前计算好行高,有助于提升性能。计算行高可能会依赖于节点层级,若构建节点模型时未设置节点层级,则可通过以下代理方法返回相应的行高(此时内部已自动赋值node.level):
- (CGFloat)treeListView:(ZKTreeListView *)listView rowHeightForNode:(ZKTreeNode *)node atIndexPath:(NSIndexPath *)indexPath
复制代码

此代理方法会在每次返回时为node.rowHeight赋值,避免重复计算带来的性能消耗

  • expand:节点的展开状态(YES:展开,NO:折叠),默认为NO,无需设置,用于内部操作
  • childNodesCount:当前节点的子节点总数,用于子节点分页,无需分页时请勿设置
  • pageIndex:当前节点的子节点页码,,用于子节点分页,无需分页时请勿设置

4.加载数据:

  • 首次加载数据,使用:
- (void)loadNodes:(NSArray<ZKTreeNode *> *)nodes;
复制代码
  • 追加数据数据,使用:
- (void)appendNodes:(NSArray<ZKTreeNode *> *)nodes;
复制代码

// 在 node 子节点的末尾追加子节点(当 node == nil 时,在根节点末尾追加数据)
- (void)appendChildNodes:(NSArray<ZKTreeNode *> *)nodes forNode:(nullable ZKTreeNode *)node;
复制代码

两种方法的区别:
  前者仅限于在根节点末尾追加数据,例如上拉加载更多,会创建新的分组,多个manager管理;而后者可以在子节点末尾追加数据,不会创建新的分组,单一manager管理。在根节点追加数据时,推荐使用前者。

5.其他方法:

  • 刷新一组节点
- (void)reloadNodes:(NSArray<ZKTreeNode *> *)nodes;
复制代码
  • 删除一个节点
- (void)deleteNode:(ZKTreeNode *)node;
复制代码
  • 展开/折叠节点
/** 全部展开/折叠到多少层级 */
- (void)expandAllNodesWithLevel:(NSInteger)expandLevel;
/** 展开/折叠一组 nodes */
- (void)expandNodes:(NSArray<ZKTreeNode *> *)nodes withExpand:(BOOL)isExpand;
复制代码
  • 主要代理方法:
@required
// 返回每个节点的cell
- (ZKTreeListViewCell *)treeListView:(ZKTreeListView *)listView cellForNode:(ZKTreeNode *)node atIndexPath:(NSIndexPath *)indexPath;
@optional
// 返回cell行高
- (CGFloat)treeListView:(ZKTreeListView *)listView rowHeightForNode:(ZKTreeNode *)node atIndexPath:(NSIndexPath *)indexPath;
// 点击回调
- (void)treeListView:(ZKTreeListView *)listView didSelectNode:(ZKTreeNode *)node atIndexPath:(NSIndexPath *)indexPath;
复制代码

详细使用参见Demo,注释写得很清楚。

性能

考虑到autoLayout在cell的子控件较多时的性能瓶颈,本框架采用最原始的frame布局?,简单测了下,基本满帧运行,本渣对性能方面研究不深,大佬莫取笑

不足

由于树状结构列表使用范围较窄,并且与业务耦合严重,所以框架目前的可定制化程度不高。如果本框架不能满足项目需求,可将 ZKTreeNode 和 ZKTreeManager 单独抽离使用,自己去实现视图类。

Future

1.提升可定制化程度; 2.自适应行高; 3.简化使用。

GitHub

github.com/bestDew/ZKT…

感谢

如果本框架对你有帮助,烦劳给颗星,谢谢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值