将数据从tableviewcontroller发送到detailviewcontroller
我有一个名为DetailTableViewController的tableviewcontroller,我需要将数据传递给名为DetailTableViewController的下一个tableviewcontroller。 但是当用户点击DetailTableViewController的单元格时,我需要传递数据。 然后,我得到错误为“意外地发现零,而解包可选值”。请帮我理清Swift 3。
首先在详细视图控制器中创build一个variables,以保存从第一个视图控制器发送的值。 然后在第一个视图控制器中的didSelectRowAt
方法内分配值,然后以编程方式导航。 这样,你就不需要为执行prepare for segue
方法来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) }
我从头创build了一个video教程。 如何将数据从一个表视图控制器传递给另一个 。 希望这会对你有所帮助。
-
首先, 从来没有从视图(单元格)中获取数据,在这种情况下,始终从模型(数据源数组)获取它。
-
其次,
prepare(for segue
的签名prepare(for segue
对于Swift 3来说prepare(for segue
是错误的。
在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] } }
在你的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) }
当你调用performSegue的时候,var的值似乎并没有值。 尝试用下面的代码来分配valueToPass的值:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { valueToPass = guides[indexPath.row] performSegue(withIdentifier: "Cell", sender: self) }
并从你的viewController创build你的segue,也许你从cell创buildsegue。