如何从另一个VC调用变量?判断变量非空的代码报错咨询
解决跨ViewController访问变量的问题
嘿,我来帮你搞定这个问题!你遇到的核心问题是混淆了类属性和实例属性的访问方式——SecondViewController.myString2是试图直接访问类本身的属性,但你的myString2应该是属于SecondViewController某个具体实例的,所以直接用类名调用肯定会报错。
简单来说,SecondViewController就像一个“模板”,而你通过segue跳转到的是这个模板生成的“具体对象(实例)”,只有这个具体对象才拥有myString2这个属性,模板本身并没有这个属性。
正确的代码实现方案
场景1:通过Segue跳转时处理
如果是在prepare(for:sender:)方法里做逻辑处理,正确的步骤应该是先获取目标VC的实例,再访问它的属性做判断:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // 先安全获取目标VC的实例 guard let secondController = segue.destination as? SecondViewController else { return // 类型转换失败时直接退出,避免崩溃 } // 现在判断这个实例的myString2是否为空,同时结合switch2的状态 if switch2?.isOn == true && secondController.myString2 != " " { // 执行你的逻辑,比如重新赋值 secondController.myString2 = "blabla" } }
场景2:已持有SecondViewController的实例引用
如果你的当前VC已经通过代码初始化、或者其他方式保存了SecondViewController的实例,直接访问这个实例的属性即可:
// 假设你已经有一个SecondViewController的实例引用 let mySecondVC = SecondViewController() // 判断实例的属性并执行逻辑 if switch2?.isOn == true && mySecondVC.myString2 != " " { mySecondVC.myString2 = "blabla" }
额外注意事项
- 确保
myString2在SecondViewController中是实例属性(不要用static/class修饰),比如正确的定义:class SecondViewController: UIViewController { var myString2: String = " " // 实例属性:每个VC实例都有自己的一份 // static var myString2: String = " " // 类属性:属于类本身,所有实例共享,这不是你要的 } - 如果你的需求是在跳转前判断某个前置条件,那这个变量应该放在当前VC中,而不是目标VC——因为目标VC的实例在segue触发前可能还未创建,此时访问它的属性没有意义。
内容的提问来源于stack exchange,提问作者Rafa
相关产品推荐
相关产品推荐

