使用结构和数组在tableviews(5)之间传递数据

时间:2019-04-16 05:45:24

标签: arrays swift uitableview struct

我该如何在多个表视图(5)之间传输数据,并且在每个tableviewcell中有一个数据数组,单击该数据或数组元素后,它将把我们发送到下一个表视图单元格中与该元素相关的数据单击显示。 我将数据发送到第三个表格视图单元格,但我不知道如何填充第四和第五个表格视图单元格。 我正在为数据传递准备segue。.

首先,我想在表格视图中显示数据,当我单击数据元素时,它将带我进入下一个与元素相关的表格视图,依此类推...

2 个答案:

答案 0 :(得分:0)

您需要将Tag赋予tableView,并使用Tag可以在tableViewnumberOfRowsInSection中指定cellForRowAt。 使用Tag,您可以标识tableView,并据此可以从特定数组分配值。不要忘记添加UITableViewDelegateUITableViewDatasource

Difference between UITableViewDelegate and UITableViewDatasource

您只需要调用开关盒并返回电池即可。

答案 1 :(得分:0)

有很多方法可以做到这一点。通常,我通常更喜欢为TableViewCell分配一个模型,然后让单元格呈现自己。

考虑到您具有这样的模型结构:

struct MyData: Codable {
    let planets: [Planet]
}

struct Planet: Codable {
    let name: String
    let continents: [Continent]
}

struct Continent: Codable {
    let name: String
    let countries: [Country]
}

struct Country: Codable {
    let name: String
    let states: [State]
}

struct State: Codable {
    let name: String
    let cities: [City]
}

struct City: Codable {
    let name: String
}

和一个这样的PlanetCell:

class PlanetCell: UITableViewCell {
    static let identifier = "planetCell"

    @IBOutlet weak var titleLabel: UILabel!

    var planet: Planet! {
        didSet {
          renderSelf()
        }
    }

    private func renderSelf() {
      titleLabel.text = planet.name
    }
}

在第一个TableView的数据源中,您将渲染一个行星:

// MARK: - UITableViewDataSource
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: PlanetCell.identifier, for: indexPath) as! PlanetCell

    cell.planet = planets[indexPath.row]

    return cell
}

现在,当您选择PlanetCell时,只需使用UITableViewDelegate中的委托方法来执行segue并将数据传递给下一个ViewController。

// MARK: - UITableViewDelegate
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    performSegue(withIdentifier: "showPlanet", sender: planets[indexPath.row])
}

// MARK: - Navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  guard let continentsViewController = segue.destination as? ContinentsViewController else {
    return
  }

  continentsViewController.continents = (sender as! Planet).continents
}

只需对所有视图控制器应用相同的逻辑。