Swift中为何无法将属性值传递至另一个ViewController?
问题原因
核心问题是重复创建了两个独立的RestaurantViewController实例:
- 你手动通过
storyboard?.instantiateViewController创建了一个VC实例并为restaurantNametxt赋值,但这个实例并未被用于页面跳转。 - 后续调用的
performSegue(withIdentifier:)会从Storyboard中重新生成一个全新的RestaurantViewController实例,这个新实例的restaurantNametxt还是默认空字符串,导致UILabel显示为空。
解决方案
以下两种方式二选一即可解决问题:
方式一:通过Segue的prepare方法传值
删除手动实例化VC的代码,改用Segue的生命周期方法传递数据:
修改ReservationViewController代码:
extension ReservationViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { restaurantsTableView.deselectRow(at: indexPath, animated: true) // 将选中的indexPath作为参数传递给Segue performSegue(withIdentifier: "restaurantDetail", sender: indexPath) } } // 添加Segue准备方法 extension ReservationViewController { override func prepare(for segue: UIStoryboardSegue, sender: Any?) { guard segue.identifier == "restaurantDetail", let destinationVC = segue.destination as? RestaurantViewController, let selectedIndexPath = sender as? IndexPath else { return } // 给目标VC的属性赋值 destinationVC.restaurantNametxt = searchRestaurant[selectedIndexPath.row].restaurantName } }
方式二:直接使用手动实例化的VC跳转(弃用Segue)
如果不想用Segue,直接用你创建的VC实例执行跳转操作,删除performSegue调用:
修改ReservationViewController代码:
extension ReservationViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { if let vc = storyboard?.instantiateViewController(withIdentifier: "restaurantDetail") as? RestaurantViewController { vc.restaurantNametxt = searchRestaurant[indexPath.row].restaurantName // 使用导航控制器push跳转(如果是present方式则用present方法) navigationController?.pushViewController(vc, animated: true) } restaurantsTableView.deselectRow(at: indexPath, animated: true) } }
验证说明
修改完成后,RestaurantViewController的viewDidLoad中打印的restaurantNametxt会显示正确的餐厅名称,UILabel也会同步展示对应内容。
内容的提问来源于stack exchange,提问作者Branislav Fekeč
相关产品推荐
相关产品推荐

