如何在iOS中创建分层菜单?

时间:2013-09-10 05:59:23

标签: ios objective-c uitableview hierarchical-data

在我的应用程序中,我有一个菜单定义如下。菜单上的每个项目都是具有以下数据属性的节点:

MenuText :(该项目会显示的文字)

isView :此项目是否为叶级项目

subMenus :如果isView为false,则此属性下有多个菜单项。

因此,它是一种可以直到任何深度的树状结构。菜单中的项目可以定期更改,因此必须保持灵活的实施。此数据存储在plist文件中,并在代码中读取NSArray(已实施)。

我现在需要在左侧创建一个幻灯片菜单,该菜单将由此数据层次结构填充。我创建了菜单窗格并添加了滑动手势,所有这些都可以正常工作。菜单必须是可折叠的,单击一个菜单项会扩展其下面的subViews。如果单击的项目是视图,则会在屏幕的其余部分上使用适当的数据加载新视图。

我面临的问题是从UITableView数据填充菜单(NSArray)的逻辑。以下是我提出的两种方法。

  1. 创建一个UITableView,其中包含与菜单顶层项目一样多的部分。然后递归地遍历菜单项。对于不是视图的每个菜单项(即它具有subMenus),创建一个新的部分,其行数等于其下的subMenus个数。当我遇到一个视图的菜单项并且没有其他subMenus时,将其作为一行添加到为其上一级菜单创建的子部分。

  2. 创建一个菜单,其中包含一个部分和最多级菜单项数量的行。单击菜单项时,在其下插入行以表示其子菜单。单击同一级别上的另一个菜单项时,通过删除插入的行来折叠以前展开的菜单。单击没有子菜单的菜单项时,屏幕的其余部分将填充数据。

  3. 我已尝试过两种方法,但未能超越最初的步骤。对于第一种方法,我理解我需要添加UITableView作为UITableViewCells的一部分,这很好,但我需要递归地执行此操作。对于第二种方法,我需要知道点击的每个项目的indexPath,这可以达到多个级别。

    我想在此提出一些建议,说明我应该采取哪种方法,以及如何解决这个问题的一些指导。此外,如果有更好的方法来做到这一点,请提出建议。感谢。

3 个答案:

答案 0 :(得分:3)

在我看来,使用UINavigationController是最简单的方法。您可以根据需要推送尽可能多的UITableView。 如果它不符合您的设计要求,您可以尝试可扩展的UITableViews。开源很少:

  1. JKExpandTableView
  2. SDNestedTable
  3. iOS-Tree-Component

答案 1 :(得分:1)

感谢您的回复。我最终使用以下控件执行此操作:

Accordion for iOS

它完美地服务于我的目的,我在这里发布,以便具有相同要求的人可以找到它。

答案 2 :(得分:0)

看看TLIndexPathTools。它有一个“树”扩展,可以做到这一点。尝试运行Outline sample project。调整示例项目的主要任务是编写递归函数,将节点数组转换为TLIndexPathTreeItem个对象数组。 controller:willChangeNode:方法中的所有代码都是延迟加载的示例,听起来并不像你需要的那样。