PrepareForSegue with UITableViewController - 传递数据

PrepareForSegue with UITableViewController - Pass data

我的代码有一个大问题。我的问题是,如何从用户点击的 tableviewcell 中获取数据到详细信息viewcontroller。

我已经从数组中获取数据并将其显示在我的表中viewcontroller,但是如何使用 prepareForSegue 将该数据传递到新的 viewcontroller?

这是我在单元格中显示数据的代码。

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    // Table view cells are reused and should be dequeued using a cell identifier.
    let cellIdentifier = "MealTableViewCell"
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! MealTableViewCell

    // Fetches the appropriate meal for the data source layout.
    let meal = meals[indexPath.row]

    cell.nameLabel.text = meal.name
    cell.photoImageView.image = meal.photo
    cell.descriptionLabel.text = meal.description
    cell.servedWithLabel.text = meal.servedWith

    return cell
}

问题是,在此之外调用 prepareForSegue 意味着我不能使用例如 meal.name 将名称传递给详细信息 viewcontroller?怎么办?

希望你们能帮助我 - 我已经为此苦苦挣扎了一段时间:-(

当您单击一个单元格时。它将调用 didSelectRow。在 didSelectRow 中保存 indexPath.row 并执行 performseguewithidentifier

现在 prepareForSegue 使用 meals[selectedIndex] 从数组中获取对象并分配给 detailViewController Objects.

确保 segue 是从 ViewControllerViewController

正如 Arun 所指出的,您需要使用 -prepareForSegue。这是我将某些内容传递给您的详细信息视图控制器的方法(比如 meal.name

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    // Use this to determine the selected index path. You can also store the selected index path in a variable using -didSelectRowAtIndexPath
    let cell = sender as! UITableViewCell
    let indexPath = self.tableView.indexPathForCell(cell)

    // Get the relevant detail
    let meal = meals[indexPath.row]

    // Create reference and pass it
    let detailViewController = segue.destinationViewController as! MyDetailViewController
    detailViewController.mealName = meal.name

}

最后,只需使用您的 Storyboard(以及 select 您喜欢的任何演示和过渡风格)将 UITableViewCellMyDetailViewController 连接起来

编辑 Swift 4

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let cell = sender as! UITableViewCell
    let indexPath = self.tableView.indexPath(for: cell)

    // Get the relevant detail
    let meal = meals[indexPath!.row]

    // Create reference and pass it
    let detailViewController = segue.destination as! MyDetailViewController
    detailViewController.mealName = meal.name
}