将数据从一个TableView传递到另一个TableView

时间:2017-10-03 17:46:18

标签: swift uitableview pass-data

我已经设置了segue方法的准备工作,我相信我已成功将数据发送到第二个ViewController,但我不确定如何使用传递的数据。

例如:

Picture

当用户点击蛋白质时,我想发送到第二个tableViewController蛋白质被选中,然后用一系列蛋白质填充它。

以下是我的第一个tableview代码:

First TableView:

class OrdersTableViewController: UITableViewController {
        var titleList = ["Protein","Protein Flavor", "Base", "Base Flavor", "Side", "Additional"]

        // MARK: - Table view data source

        override func numberOfSections(in tableView: UITableView) -> Int {
            return 1
        }

        override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return titleList.count
        }

        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! OrdersTableViewCell

            cell.cellTitle.text = titleList[indexPath.row]

            // Configure the cell...

            return cell
        }

        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if (segue.identifier == "showDetailView") {
                let DVC = segue.destination as! OrderDetailTableViewController

                if let indexpath = self.tableView.indexPathForSelectedRow {
                    let proteins = titleList[indexpath.row] as String
                    DVC.sentData1 = proteins

                    print (proteins)
                }
            }
        }
    }

目前,如果我打印正在发送的值,它似乎正在工作。在这种情况下,它打印“蛋白质”。但理想情况下这就是我想要的,但我不确定该怎么做。

class OrderDetailTableViewController: UITableViewController {
    var sentData1:String!
    var proteinList = ["Salmon", "Meatballs", "Chicken", "Cod","Sausage", "Frittata"]
    var baseList = ["White Rice", "Brown Rice"]

    //take what is selected from sentData1 and populate second tableview

    if sentData1 == "Protein" {
        //populate tableview with proteinList
    }

    if sentData1 == "Base" {
        //populate tableview with baseList
    }

我发现的所有帖子都处理了一个TableView将数据发送到正常的viewController,我在尝试实现它时没有找到它。我是Swift的新手,所以任何提示都会受到赞赏。

2 个答案:

答案 0 :(得分:2)

我建议设置一个数据结构来表示你的信息而不是多个字符串数组。这是一个简单的例子:

class Nutrient {
    var kind: String
    var examples: [String]

    init(_ kind: String, examples: [String] = []) {
        self.kind = kind
        self.examples = examples
    }
}

let dataModel = [Nutrient("Protein", examples:["Salmon", "Meatballs", "Chicken", "Cod","Sausage", "Frittata"]),
                 Nutrient("Base", examples:["White Rice", "Brown Rice"])]

这样,您可以使用营养素kind字段填充您的第一个表格,并将营养素examples数组传递到您的第二个表格。除了显示的内容之外,第二个表格不需要了解任何内容。

答案 1 :(得分:1)

听起来你在故事板中使用触发你的segue,你可以删除那个触发器,只需从一个viewController到你的第二个VC的segue点。然后添加didSelectCellAtIndexPath函数:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    //save the selectedIndex in a class variable
    selectedIndex = indexPath
    performSegueWithIdentifier("showDetailView", nil)
}

然后在你的prepareForSegue:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if (segue.identifier == "showDetailView") {
            let DVC = segue.destination as! OrderDetailTableViewController
            DVC.sentData1 = titleList[selectedIndex.row]
        }
    }

然后:

class OrderDetailTableViewController: UITableViewController {
    var sentData1:String!
    var secondTableViewDataSource : [String] = []
    var proteinList = ["Salmon", "Meatballs", "Chicken", "Cod","Sausage", "Frittata"]
    var baseList = ["White Rice", "Brown Rice"]

//take what is selected from sentData1 and populate second tableview
override func viewDidLoad(){
    super.viewDidLoad()
    switch sentData1 {
    case "Protein":
        secondTableViewDataSource = proteinList
        //you may need to call tableView.reloadData() here too
        break
    default:
        break
    }
}

*我想添加,因为我看到你正在使用UITableViewController而没有任何问题...使用UIViewController并订阅UITableViewDataSource / Delegate协议将允许更多灵活性。我几乎没有使用实际的UITableViewController s