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实例:
- 第一个实例
detailViewController被正确赋值了index属性; - 但调用
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
相关产品推荐
相关产品推荐

