You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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č

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 01:50:19