【问题标题】:Passing data from one TableView to another TableView将数据从一个 TableView 传递到另一个 TableView
【发布时间】:2018-03-14 23:57:05
【问题描述】:

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

例如:

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

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

第一个 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)
                }
            }
        }
    }

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

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
    }

我发现的所有帖子都涉及将数据发送到普通 viewController 的 TableView,我在尝试实现它时发现它没有用处。我是 Swift 的新手,所以任何提示都值得赞赏。

【问题讨论】:

    标签: swift uitableview pass-data


    【解决方案1】:

    听起来您正在使用从情节提要中的点击触发您的转场,您可以删除该触发器并简单地将转场点从一个 viewController 转移到您的第二个 VC。然后添加一个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 协议将提供更大的灵活性。我几乎从不使用实际的UITableViewControllers

    【讨论】:

      【解决方案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"])]
      

      这样,您将使用 nutrition kind 字段来填充您的第一个表,并将 nutrition examples 数组传递给您的第二个表。第二个表不需要知道任何东西,除了它要显示的内容。

      【讨论】:

      • 我同意,拥有一个实际的数据结构会让你的代码库更好!
      • 我将在哪里实现它以使其工作?我喜欢这个主意
      • 这取决于真实数据的复杂程度。如果它只是静态信息,您可以在当前创建titleList 的地方进行。对于用户可以添加/删除/修改项目的数据模型,您可能需要一个“管理器”类来处理通过共享实例进行的访问。
      猜你喜欢
      • 1970-01-01
      • 2017-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多