如何将Table View行的ListID传递至下一个视图控制器?
解决TableView行选中后传递ListID到详情页的问题
首先看你当前的代码,其实已经成功把选中的Shipment对象传递到第二个视图控制器了,只是因为你把它包装成了一个数组,所以访问方式需要对应调整。当然,我们也可以优化写法让整个流程更清晰。
临时解决:直接从现有数组中访问ListID
你现在在第二个视图控制器里的ShipListID是一个只包含单个Shipment的数组,所以可以通过数组的first属性拿到对象,再访问ListID:
// 在第二个视图控制器的viewDidLoad或者其他需要的地方 if let selectedShipment = ShipListID.first { let targetListID = selectedShipment.ListID print("选中的ListID:\(targetListID)") // 这里就可以用这个ID做后续操作了 }
更优方案:传递单个Shipment对象(推荐)
既然每次只选中一行,完全没必要用数组来传递数据,我们可以修改属性类型,让代码更直观:
- 修改第二个视图控制器的属性
把原来的数组类型改成单个可选的Shipment对象:
// 替换 ShippingUnitsTableViewController 里的 var ShipListID = [Shipment]() var selectedShipment: Shipment?
- 调整第一个视图控制器的传递逻辑
在didSelectRowAt方法里,直接传递选中的单个对象,不用包装成数组:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let vc = ShippingUnitsTableViewController() vc.selectedShipment = ShipLists[indexPath.row] navigationController?.pushViewController(vc, animated: true) }
- 在第二个视图控制器中访问ListID
现在就可以安全地取出ListID了:
override func viewDidLoad() { super.viewDidLoad() if let shipment = selectedShipment { let listID = shipment.ListID // 比如把ID展示到标签上:yourLabel.text = listID print("选中的运单ID:\(listID)") } }
极简方案:直接传递ListID字符串
如果你的详情页只需要ListID这一个值,不需要Shipment的其他属性,那可以更直接:
- 在第二个视图控制器定义字符串属性
var selectedListID: String?
- 第一个视图控制器直接传递ID
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let vc = ShippingUnitsTableViewController() vc.selectedListID = ShipLists[indexPath.row].ListID navigationController?.pushViewController(vc, animated: true) }
- 在第二个视图控制器使用ID
override func viewDidLoad() { super.viewDidLoad() if let listID = selectedListID { print("选中的ListID:\(listID)") // 后续业务逻辑 } }
这样根据你的实际需求选择合适的方案就好啦~
内容的提问来源于stack exchange,提问作者Mike Volmar
相关产品推荐
相关产品推荐

