【问题标题】:How do I pass information from a table view cell in one view controller to another view controller?如何将信息从一个视图控制器中的表视图单元格传递到另一个视图控制器?
【发布时间】:2016-02-16 13:50:56
【问题描述】:

所以,我有 2 个视图控制器:

  1. 一个表视图控制器,其中包含可以按下的俱乐部名称列表。它有一个名为 ClubsTableViewController 的自定义类。
  2. 一个视图控制器,我将使用它来显示按下的俱乐部的描述。我想重用这个视图控制器来根据按下的任何俱乐部显示不同的信息。它有一个名为 ClubDetailViewController 的自定义类。

我在 Table View Controller 的每个 Table View Cell 和第二个 View Controller 之间创建了 segue,每个 segue 都有标识符“showClubDetails”。

我在 ClubsTableViewController.swift 文件中有如下方法:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "showClubDetails" {
        let detailsController = segue.destinationViewController as! ClubDetailViewController;
        if let name = self.view.viewWithTag(1) as? UILabel {
            detailsController.clubNameString = name.text!
            detailsController.clubDescriptionString = clubDescriptions[name.text!]!
        }
    }
}

我使用这种方法将从第一个视图控制器按下的俱乐部名称传递给第二个视图控制器。上面的代码适用于表格视图的第一个单元格(上图中的“Amnesty International”),因为我给它的标签是 1。

但是,我想将按下的任何俱乐部的名称传递给第二个视图控制器,但我不太确定如何执行此操作。 任何帮助,将不胜感激。 谢谢!

【问题讨论】:

  • 在选择单元格时调用你自己 performSegue。使用从 VC1 到 VC2 (ClubDetailViewController) 的一个 segue。

标签: ios iphone xcode swift ios9


【解决方案1】:

你的转场应该是这样的:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "showClubDetails" {

    let indexPath:NSIndexPath = tableView.indexPathForSelectedRow!

    let detailsController = segue.destinationViewController as! ClubDetailViewController;

        detailsController.clubNameString = names[indexPath.row]
        detailsController.clubDescriptionString = clubDescriptions[indexPath.row]
}

}

编辑:

indexPath 获取您的俱乐部的索引,然后从数组中正确发送俱乐部的名称。这意味着俱乐部名称必须在一个数组中(与俱乐部描述相同)。

【讨论】:

  • 我用了这条线:detailsController.clubDescriptionString = clubDescriptions[clubNames[indexPath.row]]!相反,因为我将描述作为值存储在字典中并且它有效。谢谢!
【解决方案2】:

不要通过视图标签获取您的俱乐部名称。

改为使用tableView.indexPathForSelectedRow.row 来获取索引。 类似于 let clubName = clubNames[tableView.indexPathForSelectedRow.row] 的东西,其中 clubNames 是包含俱乐部名称的数组。

编辑:

我没有看到您使用的是静态单元格。 发件人是您的 UITableViewCell,因此您可以通过这种方式获取标签。

let cell = sender as! UITableViewCell
let clubName = cell.textLabel.text

【讨论】:

  • 我尝试了您的建议并得到以下错误:致命错误:在展开可选值时意外发现 nil 断点位于以下行:let clubName = cell.textLabel!.text!跨度>
  • 您是否已将标签添加到单元格中?还是您使用默认的 Table View Cell 样式?
  • 我自己为每个静态单元格添加了一个标签。什么是默认的表格视图单元格样式?
  • 正如我的帖子中提到的,使用 let clubName = clubNames[tableView.indexPathForSelectedRow.row] ,clubNames 是您的俱乐部名称数组。然后 detailsController.clubDescriptionString = clubDescriptions[clubName]
猜你喜欢
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多