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 3:有弹性的 UITableView 页脚

Swift UITableView didSelectRowAtIndexPath 错误

Swift UITableView - 在 UITalbleVIew 上自定义第一行

如何在 UITableView 中显示数组中的 x 个对象,然后在向下滚动时显示更多?

Swift 3 - 使用多个自定义单元重用单元的问题

UITableView 删除动画无法正常工作