树状结构列表封装

2018-09-22  本文已影响31人  霜白露

简介

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

效果图.gif

重要事项

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

参数 解释
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主要属性:

- (CGFloat)treeListView:(ZKTreeListView *)listView rowHeightForNode:(ZKTreeNode *)node atIndexPath:(NSIndexPath *)indexPath

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

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

https://github.com/bestDew/ZKTreeTableView.git

感谢

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

上一篇 下一篇

猜你喜欢

热点阅读