Ios 将数据从tableviewcontroller发送到detailviewcontroller

Ios 将数据从tableviewcontroller发送到detailviewcontroller,ios,swift3,Ios,Swift3,我有一个名为DetailTableViewController的tableviewcontroller,我需要将数据传递给下一个名为DetailTableViewController的tableviewcontroller。但是我需要在用户单击DetailTableViewController的单元格时传递数据。然后,我得到的错误是“在展开可选值时意外发现零”。请帮助我在Swift 3中进行分类 调用performsgue时,var valueToPass似乎没有值。尝试使用以下代码分配valu

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

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

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

    valueToPass = guides[indexPath.row]
    performSegue(withIdentifier: "Cell", sender: self)
}
然后从viewController中创建segue,也许可以从单元格中创建segue


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

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

    valueToPass = guides[indexPath.row]
    performSegue(withIdentifier: "Cell", sender: self)
}
然后从viewController中创建segue,也许可以从单元格中创建segue


在您的
didSelectRow
中,您正在设置一个新的
索引XPath
。移除它就可以了

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)
}

在您的
didSelectRow
中,您正在设置一个新的
索引XPath
。移除它就可以了

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)
}
  • 首先,从不从视图(单元格)获取数据在这种情况下,总是从模型(数据源数组)获取数据

  • 其次,
    prepare(对于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]
    }
}
  • 首先,从不从视图(单元格)获取数据在这种情况下,总是从模型(数据源数组)获取数据

  • 其次,
    prepare(对于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]
    }
}

首先在详细视图控制器中创建一个变量,以保存从第一视图控制器发送的值。然后在第一视图控制器中的
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)

    }

我从头开始为您创建了一个视频教程。希望这对您有所帮助。

首先在详细视图控制器中创建一个变量,以保存您从First view controller发送的值。然后在First view controller中的
didSelectRowAt
方法中指定值,然后进行编程导航。这样,您就不需要实现
prepareforsegue
方法来发送数据

您只需要实现
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)

    }


我从头开始为您创建了一个视频教程。希望这会对您有所帮助。

我在上面给出了错误。请看一看。我在上面给出了错误。请看一看。在函数prepareforsgue中添加一个断点,并检查var valueToPass是否有值。崩溃是因为var为nilys,它为nil@didSelectRowAt在prepareForSegue之前调用DiegoQCheck如果didSelectRowAt在prepareForSegue之前调用,则在函数prepareForSegue中添加一个断点,并检查var valueToPass是否有值。崩溃是因为var为nilYes,如果didSelectRowAt在prepareForSegue之前调用,则为nil@DiegoQCheck尝试在er之前打印passedvalue变量ror行一次。它的nil@tusharmatry在错误行之前打印passedvalue变量一次。它的nil@tusharmai现在已经编辑了,但在按下所有单元格时,它只显示来自医疗阵列的数据。为什么它不读取passedvalue?vadianI现在已经从您的解决方案中编辑了…我现在怎么解决呢?你知道了吗uld在
视图中重新加载tableView将显示
但是,当按下每个单元格时,它只显示medical的内容。@vadianI现在已经编辑了,但当按下所有单元格时,它只显示medical数组中的数据。为什么它不读取传递的值?@vadianI现在已经从您的解决方案中编辑了…我现在如何解决?您应该在
视图中重新加载tableView将显示
但是,当按下每个单元格时,它仅显示medical的内容。@vadian@Tamannah视频仍在上传。请稍后再试…谢谢。先生,请您提供参考的解决方案,否则您也可以编辑上面的代码。它只显示来自的数据按下所有单元格时显示医疗阵列。@Anuradh在几分钟后显示视频教程(仍在上载)这是我为您创建的。它将向您展示如何在视图控制器之间传递数据,以及如何在有条件的情况下显示数据。尝试一下,让我知道……我一直在等待……但它说视频不可用@AnuradhS@Tamannah视频仍在上传中。请稍后再试…谢谢。先生,您能给出参考的解决方案吗e或者你也可以编辑上面的代码。当按下所有单元格时,它只显示来自医疗阵列的数据。@Anuradh在几分钟后阅读视频教程(仍在上载)这是我为您创建的。它将向您展示如何在视图控制器之间传递数据,以及如何在有条件的情况下显示数据。尝试一下,让我知道……我一直在等待……但它说视频不可用@Anuradh S