在我的应用程序中,我有一个菜单定义如下。菜单上的每个项目都是具有以下数据属性的节点:
MenuText :(该项目会显示的文字)
isView :此项目是否为叶级项目
subMenus :如果isView为false,则此属性下有多个菜单项。
因此,它是一种可以直到任何深度的树状结构。菜单中的项目可以定期更改,因此必须保持灵活的实施。此数据存储在plist
文件中,并在代码中读取NSArray
(已实施)。
我现在需要在左侧创建一个幻灯片菜单,该菜单将由此数据层次结构填充。我创建了菜单窗格并添加了滑动手势,所有这些都可以正常工作。菜单必须是可折叠的,单击一个菜单项会扩展其下面的subViews
。如果单击的项目是视图,则会在屏幕的其余部分上使用适当的数据加载新视图。
我面临的问题是从UITableView
数据填充菜单(NSArray
)的逻辑。以下是我提出的两种方法。
创建一个UITableView
,其中包含与菜单顶层项目一样多的部分。然后递归地遍历菜单项。对于不是视图的每个菜单项(即它具有subMenus
),创建一个新的部分,其行数等于其下的subMenus
个数。当我遇到一个视图的菜单项并且没有其他subMenus
时,将其作为一行添加到为其上一级菜单创建的子部分。
创建一个菜单,其中包含一个部分和最多级菜单项数量的行。单击菜单项时,在其下插入行以表示其子菜单。单击同一级别上的另一个菜单项时,通过删除插入的行来折叠以前展开的菜单。单击没有子菜单的菜单项时,屏幕的其余部分将填充数据。
我已尝试过两种方法,但未能超越最初的步骤。对于第一种方法,我理解我需要添加UITableView
作为UITableViewCells
的一部分,这很好,但我需要递归地执行此操作。对于第二种方法,我需要知道点击的每个项目的indexPath
,这可以达到多个级别。
我想在此提出一些建议,说明我应该采取哪种方法,以及如何解决这个问题的一些指导。此外,如果有更好的方法来做到这一点,请提出建议。感谢。
答案 0 :(得分:3)
在我看来,使用UINavigationController是最简单的方法。您可以根据需要推送尽可能多的UITableView。 如果它不符合您的设计要求,您可以尝试可扩展的UITableViews。开源很少:
答案 1 :(得分:1)
答案 2 :(得分:0)
看看TLIndexPathTools。它有一个“树”扩展,可以做到这一点。尝试运行Outline sample project。调整示例项目的主要任务是编写递归函数,将节点数组转换为TLIndexPathTreeItem
个对象数组。 controller:willChangeNode:
方法中的所有代码都是延迟加载的示例,听起来并不像你需要的那样。