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

UITableView控制器间传值异常:赋值正确但接收失败的原因及解决

问题描述

尝试从第一个UITableView控制器向第二个DetailViewController传递数据,使用了以下代码:

第一个控制器代码

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            
        let detailViewController = DetailViewController()
        detailViewController.index = indexPath.row + 1
        print(detailViewController.index) // 输出正确的indexPath.row
            
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        self.navigationController?.pushViewController(DetailViewController(), animated: true)
    }

第二个控制器代码

var index = Int()

override func viewDidLoad() {
        super.viewDidLoad()
        print(index) // 输出默认值
}

传递数据时,第一个控制器打印的index是正确的,但第二个控制器始终输出默认值,请问原因是什么,该如何修复?


原因分析

你创建了两个完全独立的DetailViewController实例:

  1. 第一个实例detailViewController被正确赋值了index属性;
  2. 但调用pushViewController时,又新建了一个DetailViewController()实例,这个新实例的index属性从未被赋值,自然会输出默认的初始值。

修复方案

只需要将已经赋值好的那个detailViewController实例推入导航栈,而不是新建一个:

修改第一个控制器的代码如下:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            
        let detailViewController = DetailViewController()
        detailViewController.index = indexPath.row + 1
        print(detailViewController.index)
            
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        // 改为push已经赋值的detailViewController实例
        self.navigationController?.pushViewController(detailViewController, animated: true)
    }

这样第二个控制器就能接收到正确的index值,在viewDidLoad中打印出预期结果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 12:49:55