将值从 table 视图控制器传递到视图控制器
Passing value from table view controller to view controller
我试图将用户点击的单元格的值传递给另一个视图控制器。
这是我的代码。
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”为nil。
然后我添加了“performSegue()”。
它仍然没有用。问题是第二个屏幕显示了两次。第一次与上图相同。并且第二次正确。
但是当我试图点击左上角的后退按钮时。它返回到 nil 页面而不是 ProductDetail 页面。截图如下
似乎总是先调用 "prepare" 方法,然后再调用 tableView。如何更改顺序?如果可以的话,我想这应该是固定的。
希望得到您的帮助。
谢谢。
问题原因:
在您的故事板中,您可能已将 ProductDetailsViewController
直接绑定到 UITableViewCell
。
表示在第click/selection行,直接进行segue(导航)操作
同时,您以编程方式使用 performSegue(withIdentifier: "ProductDetailSegue", sender: self)
执行导航操作
解法:
您有两种方法可以解决这个问题。
- 我建议 - 在您的故事板中,将 segue 连接从
UITableViewCell
切换到 UIViewController
(从 UITableViewCell
中删除 segue 连接并使用 UIViewController
附加相同的 segue 连接你的表格视图)
- 在您的源代码中,delete/remove 这一行
performSegue(withIdentifier: "ProductDetailSegue", sender: self)
并处理来自该函数的数据传输 override func prepare(for segue: UIStoryboardSegue, sender: Any?)
我试图将用户点击的单元格的值传递给另一个视图控制器。
这是我的代码。
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”为nil。
然后我添加了“performSegue()”。 它仍然没有用。问题是第二个屏幕显示了两次。第一次与上图相同。并且第二次正确。
但是当我试图点击左上角的后退按钮时。它返回到 nil 页面而不是 ProductDetail 页面。截图如下
似乎总是先调用 "prepare" 方法,然后再调用 tableView。如何更改顺序?如果可以的话,我想这应该是固定的。
希望得到您的帮助。 谢谢。
问题原因:
在您的故事板中,您可能已将 ProductDetailsViewController
直接绑定到 UITableViewCell
。
表示在第click/selection行,直接进行segue(导航)操作
同时,您以编程方式使用 performSegue(withIdentifier: "ProductDetailSegue", sender: self)
解法:
您有两种方法可以解决这个问题。
- 我建议 - 在您的故事板中,将 segue 连接从
UITableViewCell
切换到UIViewController
(从UITableViewCell
中删除 segue 连接并使用UIViewController
附加相同的 segue 连接你的表格视图) - 在您的源代码中,delete/remove 这一行
performSegue(withIdentifier: "ProductDetailSegue", sender: self)
并处理来自该函数的数据传输override func prepare(for segue: UIStoryboardSegue, sender: Any?)