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

时间:2017-08-09 09:38:35

标签: ios iphone uitableview swift3 uistoryboardsegue

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

这是我的代码。

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()”。 它仍然无法正常工作。事情是第二个屏幕显示两次。第一次与上图相同。第二次是正确的。

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

enter image description here

enter image description here

似乎"准备"始终首先调用tableView然后调用tableView。如何更改订单?如果可以,我认为这应该是固定的。

希望得到你的帮助。 谢谢。

1 个答案:

答案 0 :(得分:1)

问题原因:
在您的故事板中,您可以直接ProductDetailsViewControllerUITableViewCell绑定。

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

同时,以编程方式使用performSegue(withIdentifier: "ProductDetailSegue", sender: self)

执行导航操作

<强>解决方案:
你有两种方法可以解决这个问题。

  1. 我建议 - 在你的故事板中,将segue连接从UITableViewCell切换到UIViewController(从UITableViewCell删除segue连接并附加与UIViewController相同的segue连接的tableview)
  2. 在您的源代码中,删除/删除此行performSegue(withIdentifier: "ProductDetailSegue", sender: self)并处理此函数的数据传输override func prepare(for segue: UIStoryboardSegue, sender: Any?)