服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS多级列表实现代码

iOS多级列表实现代码

2021-01-28 16:31好个秋先生 IOS

这篇文章主要为大家详细介绍了iOS多级列表实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

在项目开发中,层级列表经常遇到,简单点的二级列表利用uitableview的header就可以实现,再简单点的三级列表通过对cell高度进行调整也可以实现三级列表的效果。但遇到多级列表,尤其是层次不明的动态列表就比较麻烦了。

原理

层级列表和树形结构比较类似,不过不是二叉树,而是多叉树。每个节点只需要拥有指向父节点和子节点的两个指针,就能形成一颗树。我们将多级列表中每一级对象看作一个node,node拥有两个属性,分别为父节点和子节点的id。

每棵树有个一个虚拟的root节点,它的id为rootid,所有节点中凡是父节点id为rootid的便是第一级,对应树结构中的depth(深度)。这样每一个node对象就都拥有了parentid和childrenid, childrenid为node对象的id。

我们可以通过rootid查出第一级node,再根据第一级node的childrenid查出下一级,依次类推,确定所有节点的父子关系。同时也可以确定叶子节点和第一级节点,也可称

为根节点。

效果图

1.一般多级列表

iOS多级列表实现代码

2.记录节点历史状态的列表

iOS多级列表实现代码

思路

1.首先根据 rootid 获取所有第一级节点,并放入uitableview的数据源 datasourcearr 中,展示初始化列表

2. 展开: 点击节点cell,根据 childrenid 查找下一级nodes,并插入到 datasourcearr 中currentnode的后面,刷新展示

3. 收拢: 点击以打开节点cell,从 datasourcearr 的currentindex+1开始,如果该节点的level小于currentnode的level,则移除node,否则停止刷新列表。

4.点击cell为叶子节点则不响应展开或收拢操作,并把节点信息通过返回。

datasourcearr中是这样的一种符合树层级结构的顺序:

iOS多级列表实现代码

定义节点对象

iOS多级列表实现代码

遇到问题

1.局部刷新的问题

每次展开或收拢以后刷新列表,一开始采用

 

复制代码 代码如下:
- (void)reloadsections:(nsindexset *)sections withrowanimation:(uitableviewrowanimation)animation


但会导致节目有整体闪烁的效果,体验不好。最后考虑采用局部刷新 insertrowsatindexpaths 和 deleterowsatindexpaths 。

 

但在刷新中会报错

* terminating app due to uncaught exception 'nsinternalinconsistencyexception', reason: 'attempt to delete row 2 from section 0 which only contains 2 rows before the update'

推测原因是 current cell在刷新时的numberofrowsinsection和刷新insert or del的cell时numberofrowsinsection不一致导致 。然后尝试current cell和其他cell分别刷新,完美刷新。

?
1
2
3
4
5
6
7
8
9
10
11
12
[_reloadarray removeallobjects];
 [tableview reloadrowsatindexpaths:@[indexpath] withrowanimation:uitableviewrowanimationnone];
 
 if (currentnode.isexpand) {
  //expand
  [self expandnodesforparentid:currentnode.childrenid insertindex:indexpath.row];
  [tableview insertrowsatindexpaths:_reloadarray withrowanimation:uitableviewrowanimationnone];
 }else{
  //fold
  [self foldnodesforlevel:currentnode.level currentindex:indexpath.row];
   [tableview deleterowsatindexpaths:_reloadarray withrowanimation:uitableviewrowanimationnone];
 }

2.怎么保存节点历史状态

当文件级层比较多时,有时希望能关掉层级后再打开时还能保留子层级的打开状态。我们可以会给每一个node一个是否展开的属性,当fold时只修改currentnode的expand属性,expand时对子节点序isexpand=yes的进行遍历插入。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//expand
- (nsuinteger)expandnodesforparentid:(nsstring*)parentid insertindex:(nsuinteger)insertindex{
 
 for (int i = 0 ; i<_nodes.count;i++) {
  yknodemodel *node = _nodes[i];
  if ([node.parentid isequaltostring:parentid]) {
   if (!self.ispreservation) {
    node.expand = no;
   }
   insertindex++;
   [_tempnodes insertobject:node atindex:insertindex];
   [_reloadarray addobject:[nsindexpath indexpathforrow:insertindex insection:0]];//need reload nodes
 
   if (node.isexpand) {
    insertindex = [self expandnodesforparentid:node.childrenid insertindex:insertindex];
   }
  }
 }
 
 return insertindex;
}

demo地址:
https://github.com/yangka/ykmutableleveltableview.git

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://www.jianshu.com/p/a040ff9e3ae3

延伸 · 阅读

精彩推荐
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17