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

iOS Swift使用Segue跳转时TableView之间传值为空是什么原因?

问题原因

你当前代码的逻辑存在实例不匹配的问题:手动初始化了一个MealsByCategoryVC实例并为它的mealCategory赋值,但调用performSegue(withIdentifier:sender:)方法时,系统会自动生成一个全新的MealsByCategoryVC实例完成跳转,你之前赋值的实例根本没有被加载到页面栈中,所以跳转后打印的变量自然为空。

解决方案

方案1:使用Segue自带的传值方法(推荐,适配你当前的Segue跳转逻辑)

  1. 调整didSelectRowAt方法,把选中的分类作为sender参数传递,不需要手动创建目标控制器实例:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let category = listOfCategories[indexPath.row].strCategory
    print(category) // Properly returns the category
    performSegue(withIdentifier: "searchMeals", sender: category)
}
  1. 在当前控制器中实现prepare(for:sender:)方法,获取Segue对应的目标控制器完成赋值:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    guard segue.identifier == "searchMeals",
          let targetVC = segue.destination as? MealsByCategoryVC,
          let sendCategory = sender as? String else { return }
    targetVC.mealCategory = sendCategory
}

方案2:放弃Segue,直接跳转手动创建的控制器实例

如果不需要依赖Storyboard的Segue,可以直接删除Storyboard中对应的Segue,用代码完成跳转,此时你手动创建的实例会被直接使用:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let category = listOfCategories[indexPath.row].strCategory
    let vc = MealsByCategoryVC()
    vc.mealCategory = category
    print(category) // Properly returns the category
    // 导航栈push跳转用下面这行
    navigationController?.pushViewController(vc, animated: true)
    // 模态跳转用下面这行
    // present(vc, animated: true)
}

内容的提问来源于stack exchange,提问作者Andrew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:15:02