从表格视图控制器传递值到视图控制器

从表格视图控制器传递值到视图控制器

问题描述:

我试图将用户单击的单元格的值传递给另一个视图控制器。从表格视图控制器传递值到视图控制器

这是我的代码。

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    productDisplayed = currentProductList[indexPath.row] as? Product 
    performSegue(withIdentifier: "ProductDetailSegue", sender: self) 
} 


override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if (segue.identifier == "AddProductSegue"){ 
     let controller: AddProductViewController = segue.destination as! AddProductViewController 
     controller.delegate = self 
    } 

    if (segue.identifier == "ProductDetailSegue"){ 

     let controller: ProductDetailsViewController = segue.destination as! ProductDetailsViewController 
     controller.currentProduct = productDisplayed 
    } 
} 

首先,我没有写“performSegue()”。 我遇到的问题是屏幕将首先被传输,而不是将值赋给“productDisplayed”,这意味着第二个VC中的对象“currentProduct”为零。

然后我加了“performSegue()”。 它仍然没有工作。事情是第二个屏幕显示两次。第一次与上面的图片一样。第二次是正确的。

但是,当我试图点击左上方的后退按钮。它返回到零页面而不是ProductDetail页面。截图如下。

enter image description here

enter image description here

这似乎是 “准备” 方法总是被称为第一次那么的tableView。如何更改订单?如果可以,我认为这应该是固定的。

希望能得到您的帮助。 谢谢。

原因问题:
在你的故事板,你可能已经束缚,ProductDetailsViewControllerUITableViewCell直接。

这意味着,点击/选择行后,它将直接执行segue(导航)操作。

与此同时,编程执行使用performSegue(withIdentifier: "ProductDetailSegue", sender: self)

解决方案导航操作:
有两种方法来解决这个问题。

  1. 我建议 - 在你的故事板,交换机从UITableViewCellUIViewController(取下UITableViewCell赛格瑞连接,并连接你的tableview的UIViewController相同SEGUE连接)
  2. 在你的源代码,删除赛格瑞连接/删除此行performSegue(withIdentifier: "ProductDetailSegue", sender: self)并处理来自此功能的数据传输override func prepare(for segue: UIStoryboardSegue, sender: Any?)
+0

我试图删除“performSegue()”。但转移的对象当时没有。这似乎是价值没有分配给productDisplayed。 –

+0

哇!你的第一种方式有效!非常感谢你。但我仍然对如何以第二种方式制作它感到困惑。 –

+0

很酷。答案被接受。你能解释为什么第二种方式不起作用吗? –