Xcode:从Storyboard实例化ViewController修改静态变量无效
问题原因及解决方案
核心问题
你犯了两个关键错误:
- 混淆静态变量与实例属性:
vc1里的static var title是类级静态变量,属于整个vc1类而非单个实例;但你在代码里写的vc.title = "bla",实际访问的是UIViewController自带的实例属性title(用于导航栏标题的系统属性),根本没修改到你自定义的静态变量。 - 命名冲突:自定义静态变量
title和UIViewController的系统实例属性重名,进一步加剧了混淆。
解决方案
根据你的需求,分两种场景处理:
场景1:确实需要类级静态变量(所有vc1实例共享同一个标题)
- 先修改
vc1的代码,给静态变量改名避免冲突:
import UIKit class vc1: UIViewController { @IBOutlet weak var lbl_title: UILabel! // 改名避免和系统title冲突 static var customTitle = "initial value" override func viewDidLoad() { super.viewDidLoad() // 访问类的静态变量 lbl_title.text = vc1.customTitle } }
- 在根视图控制器中,直接修改类的静态变量(而非实例属性):
import UIKit class ViewController: UIViewController { @IBOutlet weak var btn_go: UIButton! @IBAction func btn_gogogo(_ sender: Any) { // 先修改类的静态变量 vc1.customTitle = "bla" // 再实例化控制器 let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "vc1") as! vc1 self.present(vc, animated: true, completion: nil) } }
场景2:每个vc1实例需要独立的标题(更推荐的常规场景)
如果不需要共享标题,应该用实例属性而非静态变量:
- 修改
vc1代码:
import UIKit class vc1: UIViewController { @IBOutlet weak var lbl_title: UILabel! // 改成实例属性,每个实例独立拥有 var customTitle = "initial value" override func viewDidLoad() { super.viewDidLoad() // 访问当前实例的属性 lbl_title.text = customTitle } }
- 根视图控制器中修改实例属性:
import UIKit class ViewController: UIViewController { @IBOutlet weak var btn_go: UIButton! @IBAction func btn_gogogo(_ sender: Any) { let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "vc1") as! vc1 // 修改实例的属性 vc.customTitle = "bla" self.present(vc, animated: true, completion: nil) } }
内容的提问来源于stack exchange,提问作者mtacki
相关产品推荐
相关产品推荐

