iOS多级列表实现代码

 更新时间:2016年09月19日 16:26:21   作者:好个秋先生  
这篇文章主要为大家详细介绍了iOS多级列表实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

原理

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

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

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

为根节点。

效果图

1.一般多级列表

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

思路

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

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

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

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

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

定义节点对象

遇到问题

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分别刷新,完美刷新。

[_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的进行遍历插入。

//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

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

相关文章

  • iOS基础动画教程分享

    iOS基础动画教程分享

    这篇文章主要为大家详细介绍了iOS几种基础动画教程,包括位置动画、透明度动画、大小动画等,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • iOS 对view进行截图的示例代码

    iOS 对view进行截图的示例代码

    本篇文章主要介绍了iOS 对view进行截图的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • iOS手势识别的详细使用方法(拖动,缩放,旋转,点击,手势依赖,自定义手势)

    iOS手势识别的详细使用方法(拖动,缩放,旋转,点击,手势依赖,自定义手势)

    这篇文章主要介绍了iOS手势识别的详细使用方法(拖动,缩放,旋转,点击,手势依赖,自定义手势),具有一定的参考价值,有需要的可以参考一下。
    2016-11-11
  • IOS与网页JS交互详解及实例

    IOS与网页JS交互详解及实例

    这篇文章主要介绍了 IOS与网页JS交互详解及实例的相关资料,需要的朋友可以参考下
    2016-12-12
  • Xcode提高开发效率的代码块分享

    Xcode提高开发效率的代码块分享

    这篇文章跟大家介绍的是一些提高大家开发效率Xcode的代码块,以及如何备份代码块,Xcode的代码片段(Code Snippets)创建自定义的代码片段,当你重用这些代码片段时,会给你带来很大的方便。有需要的朋友们可以参考借鉴。
    2016-09-09
  • iOS实现文字水平无间断滚动效果

    iOS实现文字水平无间断滚动效果

    这篇文章主要为大家详细介绍了iOS实现文字水平无间断滚动效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • iOS实现摄像头实时采集图像

    iOS实现摄像头实时采集图像

    这篇文章主要为大家详细介绍了iOS实现摄像头实时采集图像,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • IOS 开发之Swift 元组的实例详解

    IOS 开发之Swift 元组的实例详解

    这篇文章主要介绍了IOS 开发之Swift 元组的实例详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • iOS应用程序中通过dispatch队列控制线程执行的方法

    iOS应用程序中通过dispatch队列控制线程执行的方法

    Grand Central Dispatch简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统,iOS应用程序中通过dispatch队列控制线程执行则是以并发来达到多核优化的重要途径.
    2016-05-05
  • iOS CoreAnimation 图层几何学

    iOS CoreAnimation 图层几何学

    本文主要介绍了iOS CoreAnimation图层几何学,图层几何所讲主要是有关图层的位置,尺寸等几何类属性。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03

最新评论