Swift 如何通过表视图传递数据

Swift 如何通过表视图传递数据,swift,uitableview,Swift,Uitableview,我的数据结构示例 Sports Bat-and-ball Baseball Softball Cricket Hockey Field Hockey Ice Hockey Roller Hockey Engineering Computer Science Software Engineer

我的数据结构示例

  Sports  
      Bat-and-ball
           Baseball
           Softball
           Cricket
      Hockey
           Field Hockey
           Ice Hockey
           Roller Hockey
  Engineering  
      Computer Science
           Software Engineer
           Electrical Engineer
这里我有三个级别的数据,如您所见。但默认情况下,在tableview中,它最多只提供2级。如何显示第三级数据。 我只能使用customcell以节的形式显示第一级数据,以行的形式显示第二级数据。现在显示第三级数据的位置。这样我就可以根据行数进行迭代

我的屏幕应该是这样的


有很多方法可以做到这一点

稍后我将列出其中的几个。 但首先,您可能会考虑在一个表视图中显示三个级别的数据是否是一种良好的用户体验。用户可能很难在其中导航

这是一些选择

  • 在选择器(下拉菜单)中显示顶级数据(我们称之为类别),然后在表视图中为所选类别显示两个级别(节和行)。 以下是此类下拉视图的示例:

  • 如果您真的需要显示一个包含3级数据的列表,您可以使用一个表视图,它将顶层数据显示为一个部分,第二级数据显示为一行。对于每一行,对应的单元格将包含在一个表视图(或者可能只是一个堆栈视图)中,该视图仅显示第三级的行


  • 您可以在自定义单元格中添加表格,第二级和第三级数据可以显示在该内部表格上

    这段代码在我的设备上运行得很好

    情节提要

    TableViewController1

    import UIKit
    
    class TableViewController1: UITableViewController {
    
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return group1.count
    }
    
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
    
        cell.textLabel?.text = group1[indexPath.row].title
    
        return cell
    }
    
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    
        if segue.identifier == "segue1" {
    
            let indexPaths = self.tableView!.indexPathsForSelectedRows!
            let indexPath = indexPaths[0] as NSIndexPath
    
            let vc = segue.destinationViewController as! TableViewController2
            vc.currentGroup = group1[indexPath.row].title
    
        }
    }
    }
    
    TableViewController2

    import UIKit
    
    class TableViewController2: UITableViewController {
    
    var currentGroup: String?
    var filteredData = [Data]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        for data in group2 {
    
            if data.group == currentGroup {
                filteredData.append(data)
            }
    
        }
    }
    
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return filteredData.count
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
    
        cell.textLabel?.text = filteredData[indexPath.row].title
    
        return cell
    }
    
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    
        if segue.identifier == "segue2" {
    
            let indexPaths = self.tableView!.indexPathsForSelectedRows!
            let indexPath = indexPaths[0] as NSIndexPath
    
            let vc = segue.destinationViewController as! TableViewController3
            vc.currentGroup = group2[indexPath.row].title
    
        }
    }
    }
    
    TableViewController3

    import UIKit
    
    class TableViewController3: UITableViewController {
    
    var currentGroup: String?
    var filteredData = [Data]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        for data in group3 {
    
            if data.group == currentGroup {
                filteredData.append(data)
            }
    
        }
    }
    
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return filteredData.count
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
    
        cell.textLabel?.text = filteredData[indexPath.row].title
    
        return cell
    }
    
    }
    
    数据类

    import Foundation
    
    class Data {
    
    var title: String
    var group: String?
    
    init (title: String, group: String?) {
        self.title = title
        self.group = group
    }
    }
    
    let group1 = [Data(title: "Sport", group: nil), Data(title: "Engineering", group: nil)]
    let group2 = [Data(title: "Hockey", group: "Sport"), Data(title: "CS", group: "Engineering")]
    let group3 = [Data(title: "Ice Hockey", group: "Hockey"), Data(title: "Software Engineer", group: "CS")]
    
    另外,我不喜欢把事情复杂化


    快乐的黑客

    好的,那么第二级和第三级将如何与第一级相关。我指的是倒计时。如果您有任何示例,请在自定义单元格中发送,您只需将数组传递给行方法dictionaryVitals.count>0{cell.datatitleArray=dictionarydata[0]as!NSArray cell.dateArray=dictionarydata[1]as!NSArray}单元格中的另一个单元格数组,但我的要求仅此一个。我拿了两个细胞的原型。一个用于将截面数据显示为第一级。在上面我按下按钮展开它。然后在第二个原型单元中,我现在显示第二级数据。但是在扩展了第二级和第三级之后,它应该在同一时间出现在自己的迭代中。你能发布截图或模拟吗?那么它应该是什么样子?您在这里描述的内容与您在问题中提出的内容不同。只有我更改了json数据,没有其他更改。。请看这里的屏幕。然后你可以使用我建议的第一种方法。将顶层数据放在单独的控件中(下拉视图)。然后将此控件用作tableHeaderView。然后将第二级数据用于节,将第三级数据用于行。因此,您只需要将数据分成两部分:1。下拉列表(第一级)2的行数组。表格视图的节数组(第二级)和行(第三级)是否可能在节中显示第一个数据。然后在第行中再次使用一个tableview,我可以在其中显示其他tableview部分的第二级,在其行中显示第三级数据。所以这里没有赛格。我的要求是在一个tableview中获取所有数据。通过segue连接的不是三个不同的tableview。