简介
运用了二叉树思想封装的树状结构列表框架,Demo实现效果如下:
重要事项
构建一个树结构,需要后台返回一些必要的参数:
参数 | 解释 |
---|---|
ID | 节点唯一标识 |
parentID | 父节点唯一标识,即为父节点ID |
sortOrder | 子节点序号,用于排序 |
框架结构
本框架主要包含四大类:
类名 | 解释 | 作用 | 备注 |
---|---|---|---|
ZKTreeNode | 节点数据模型 | 将原始数据转化为节点数据模型 | |
ZKTreeManager | 数据管理类 (核心类) | 1.构建树结构2.提供对数据的增、删、改、查 | 非线程安全 |
ZKTreeListViewCell | 单元视图类 | 组成树状列表 | 使用需继承此类 |
ZKTreeListView | 主视图类 | 将数据操作可视化 | 线程安全 |
使用步骤
1.初始化并设置其代理:
// 实例化- (instancetype)initWithFrame:(CGRect)frame style:(ZKTreeListViewStyle)style NS_DESIGNATED_INITIALIZER;// 注册自定义cell,必须继承自- (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*)nodes;复制代码
- 追加数据数据,使用:
- (void)appendNodes:(NSArray*)nodes;复制代码
或
// 在 node 子节点的末尾追加子节点(当 node == nil 时,在根节点末尾追加数据)- (void)appendChildNodes:(NSArray*)nodes forNode:(nullable ZKTreeNode *)node;复制代码
两种方法的区别:
前者仅限于在根节点末尾追加数据,例如上拉加载更多,会创建新的分组,多个manager
管理;而后者可以在子节点末尾追加数据,不会创建新的分组,单一manager
管理。在根节点追加数据时,推荐使用前者。 5.其他方法:
- 刷新一组节点
- (void)reloadNodes:(NSArray*)nodes;复制代码
- 删除一个节点
- (void)deleteNode:(ZKTreeNode *)node;复制代码
- 展开/折叠节点
/** 全部展开/折叠到多少层级 */- (void)expandAllNodesWithLevel:(NSInteger)expandLevel;/** 展开/折叠一组 nodes */- (void)expandNodes:(NSArray*)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
感谢
如果本框架对你有帮助,烦劳给颗星,谢谢?