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

3

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

这是我的代码。

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页面。截图如下。
似乎“prepare”方法总是被首先调用,然后是tableView。如何改变顺序?如果可以的话,我认为应该解决这个问题。
希望得到您的帮助。 谢谢。
1个回答

1
问题原因:
在你的故事板中,你可能直接将ProductDetailsViewControllerUITableViewCell绑定起来。
这意味着,当你点击/选择行时,它将直接执行segue(导航)操作。
同时,在程序中你使用performSegue(withIdentifier: "ProductDetailSegue", sender: self)来执行导航操作。 解决方案:
你有两种方法来解决这个问题。
  1. 我建议 - 在你的故事板中,将segue连接从UITableViewCell切换到UIViewController(删除UITableViewCell的segue连接,并将相同的segue连接附加到你表视图的UIViewController上)
  2. 在你的源代码中,删除/移除这一行performSegue(withIdentifier: "ProductDetailSegue", sender: self),并从这个函数override func prepare(for segue: UIStoryboardSegue, sender: Any?)处理数据传输。

我试图删除“performSegue()”。但是传输的对象为nil。似乎值未分配给productDisplayed。 - 王佳祺
哇!你的第一种方法可行!非常感谢。但是我仍然不清楚如何使用你的第二种方法。 - 王佳祺
好的,答案被接受了。您能否解释一下为什么第二种方法不起作用? - 王佳祺
当然,我会分享一个演示项目的样例,请给我一些时间。 - Krunal
干杯,伙计。等你 :) - 王佳祺

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接