Swift - 使用 UITableView 向下钻取分层数据
Posted
技术标签:
【中文标题】Swift - 使用 UITableView 向下钻取分层数据【英文标题】:Swift - Drill down hierarchical data with UITableView 【发布时间】:2017-02-14 16:39:08 【问题描述】:我想构建一个应用来导航数据层次结构。我一直在咨询这个Drill-down Hierarchical UITableView 页面并且真的不知道如何使用xml 来实现这种节点结构来实现这一点。我试图避免创建 100 多个 tableviewscontroller 等。据我目前的理解,我相信我需要使用节点。在我一直向下钻取之后,我将需要使用不同的视图控制器,但我相信我知道如何做到这一点。
这是我的 XML 文件的一个小例子。如有必要,我可以对其进行更改以使其正常工作。
<hnt>
<face>
<action id="1">
<name>Occipitofrontalis</name>
<type>data</type>
<description>data</description>
</action>
</face>
<temporoman>
<mandibulardep>
<action id="1">
<name>Occipitofrontalis</name>
<type>data</type>
<description>data</description>
</action>
<action id="2">
<name>Occipitofrontalis</name>
<type>data</type>
<description>data</description>
</action>
</mandibulardep>
</temporoman>
</hnt>
<face>
</face>
我正在使用此代码来解析我的 xml 文件。我不确定如何打印样本。
override func viewDidLoad()
super.viewDidLoad()
if let path = Bundle.main.url(forResource: "01 - MainCategories", withExtension: "xml")
if let parser = XMLParser(contentsOf: path)
parser.delegate = self
parser.parse()
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String])
eName = elementName
if elementName == "mainCat"
mainCategoriesTitle = String()
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?)
if elementName == "mainCat"
let mCat = MainCategories()
mCat.mainCategoriesTitle = mainCategoriesTitle
mainCat.append(mCat)
func parser(_ parser: XMLParser, foundCharacters string: String)
let data = string.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
if (!data.isEmpty)
if eName == "title"
mainCategoriesTitle += data
【问题讨论】:
您能否提供一个具有代表性的 xml 示例?你已经解析了吗?请显示从解析发出的结构。 如果每个节点的结构相似,您可以重复使用相同的视图控制器,并手动推送它。 @danh 我已经用一些代码和示例 xml 更新了我的问题。 【参考方案1】:看起来解析器希望生成类别的层次结构。 (我在 xml 示例中没有看到任何匹配的内容,但我会假设它在那里)。
首先需要的是一个树形结构的Category
对象。最简单的是,这是一个 NSObject 子类,它有一个 name
和一个子类数组 - 重要的是 - 是一个 Category
数组。
Category 上的类方法可以进行 xml 解析。将xml解析成树形结构的基本思路是:
在启动文档上,构建根目录。使其成为当前节点。 在开始元素上,创建一个子元素。将其设置为当前节点的父节点。使子节点成为当前节点。 在查找其他内容(如字符)时,在当前节点上设置属性。 在结束元素上,将当前节点的父节点设为当前节点。 在结束文档上,您已完成。那棵树就是另一个问题中正在讨论的那棵树。只有当你有一个树结构和一个正在浏览的当前节点(或当前类别)的概念时,整个想法才可能实现。
【讨论】:
您是在解释解析器在做什么或者我需要做什么来访问数据? 我在解释你的解析器必须做什么。它必须产生一个层次模型。我还解释了层次模型必须是什么(最低限度):一个包含一些数据的对象,例如“名称”,以及一个与其父级相同的子级数组。 如果您可以从 xml 生成分层模型,那么您可以在另一个问题的答案中使用该模型。在这种情况下,“节点”只是用户正在浏览的模型(类别)中的当前位置。该其他问题中的表格视图列出了当前节点的子项(子类别)。以上是关于Swift - 使用 UITableView 向下钻取分层数据的主要内容,如果未能解决你的问题,请参考以下文章
Swift UITableView didSelectRowAtIndexPath 错误
Swift UITableView - 在 UITalbleVIew 上自定义第一行