博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个树状结构列表封装
阅读量:5891 次
发布时间:2019-06-19

本文共 2743 字,大约阅读时间需要 9 分钟。

简介

运用了二叉树思想封装的树状结构列表框架,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

感谢

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

转载地址:http://nobsx.baihongyu.com/

你可能感兴趣的文章
nc 局域网聊天+文件传输(netcat)
查看>>
每天一个linux命令(25):linux文件属性详解
查看>>
go微服务框架go-micro深度学习(三) Registry服务的注册和发现
查看>>
python 重载方法有哪些特点 - 老王python - 博客园
查看>>
在Fedora8上安装MySQL5.0.45的过程
查看>>
设计模式之命令模式
查看>>
android 测试 mondey
查看>>
Spring AOP项目应用——方法入参校验 & 日志横切
查看>>
用Fiddler或Charles进行mock数据搭建测试环境
查看>>
使用REST-Assured对API接口进行自动化测试
查看>>
GitHub发布史上最大更新,年度报告出炉!
查看>>
王潮歌跨界指导HUAWEI P20系列发布会 颠覆传统 眼界大开!
查看>>
王高飞:微博已收购一直播 明年一季度重点是功能与流量打通
查看>>
趣头条发行区间7至9美元 预计9月14日美国上市
查看>>
新北市长侯友宜:两岸交流应从隔壁最亲近的人开始
查看>>
全面屏的Nokia X即将上线,不到2000元的信仰你要充值吗?
查看>>
HTML5音频audio属性
查看>>
ES6学习
查看>>
Centos7搭建Django环境
查看>>
序列化一个Intent
查看>>