【问题标题】:send data from tableviewcontroller to detailviewcontroller将数据从 tableviewcontroller 发送到 detailviewcontroller
【发布时间】:2017-03-11 19:10:30
【问题描述】:

我有一个名为 DetailTableViewController 的 tableviewcontroller,我需要将数据传递给下一个名为 DetailTableViewController 的 tableviewcontroller。但是当用户单击 DetailTableViewController 的单元格时,我需要传递数据。然后,我得到了“在展开可选值时意外发现 nil”的错误。请帮我在 Swift 3 中解决。

【问题讨论】:

  • 尝试在错误行之前打印您的passedvalue变量一次。
  • 没有@Tushar Sharma

标签: ios swift3


【解决方案1】:
  • 首先,从不在这种情况下从视图(单元格)获取数据,始终从模型(数据源数组)获取数据。

    李>
  • 其次,prepare(for segue 的签名对于 Swift 3 是错误的。

在didSelectRowAt中传递indexPath而不是self,你也可以删除valueToPass。

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    performSegue(withIdentifier: "Cell", sender: indexPath)
}

在prepareForSegue 中从模型中获取数据并传递给细节视图控制器:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == "Cell" {
        let viewController = segue.destination as! GuidesDetailsTableViewController
        let indexPath = sender as! IndexPath
        viewController.passedValue = guides[indexPath.row]
    }
}

【讨论】:

  • 我现在已经编辑了,但它只显示来自医疗阵列的数据,同时按下所有单元格。为什么它不读取 passValue ? @vadian
  • 我现在已经从您的解决方案中进行了编辑...我现在该如何解决?
  • 你应该在viewWillAppear重新加载tableView
  • 不过,当每个单元格被按下时,它只显示医疗的内容。 @vadian
【解决方案2】:

首先在您的详细视图控制器中创建一个变量来保存您从第一个视图控制器发送的值。然后在第一个视图控制器中分配 didSelectRowAt 方法内的值,然后以编程方式导航。这样发送数据就不需要实现prepare for segue方法了。

你只需要实现didselectrowat, 方法。

  func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let selected = firstArray[indexPath.row]
        let detailvc = self.storyboard?.instantiateViewController(withIdentifier: "DetailTableViewController") as! DetailTableViewController

        detailvc.type = selected
        self.present(detailvc, animated: true, completion: nil)

    }

我从头开始为您制作了一个视频教程。 how to pass data from one table view controller to another。希望这对您有所帮助。

【讨论】:

  • @Tamannah 视频仍在上传中。请尝试...。谢谢。
  • 请先生,您能否提供参考解决方案,否则您也可以在上面的代码上进行编辑。它只显示来自医疗阵列的数据,同时按下所有单元格。 @Anuradh S
  • 几分钟后(仍在上传)尝试我为您创建的视频教程。它将向您展示如何在视图控制器之间传递数据,以及如何在条件下显示数据。试试看,让我知道.....
  • 我等到现在...但它说视频不可用@Anuradh S
【解决方案3】:

在您的didSelectRow 中,您正在设置一个新的indexPath。删除它应该可以解决问题。

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    // Don't reassign indexPath
    // let indexPath = tableView.indexPathForSelectedRow!
    let currentCell = tableView.cellForRow(at: indexPath)! as UITableViewCell

    valueToPass = currentCell.textLabel?.text
    performSegue(withIdentifier: "Cell", sender: self)
}

【讨论】:

  • 我在上面给出了错误。请看一看。
【解决方案4】:

当您调用 performSegue 时,var valueToPass 似乎没有值。尝试使用以下代码分配 valueToPass 的值:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    valueToPass = guides[indexPath.row]
    performSegue(withIdentifier: "Cell", sender: self)
}

然后从你的 viewController 创建你的 segue,也许你从单元格创建 segue。

【讨论】:

  • 在函数prepareForSegue中添加断点,检查var valueToPass是否有值。崩溃是因为 var 是 nil
  • 是的,没有@DiegoQ
  • 检查 didSelectRowAt 是否在 prepareForSegue 之前调用
猜你喜欢
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多