美文网首页
树状结构列表封装

树状结构列表封装

作者: 霜白露 | 来源:发表于2018-09-22 23:55 被阅读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主要属性:

  • 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

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

感谢

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

相关文章

网友评论

      本文标题:树状结构列表封装

      本文链接:https://www.haomeiwen.com/subject/sshfoftx.html