Segue跳转准备阶段如何访问变量?数组传递为空问题求助
解决Segue传递数组为空的问题
兄弟,太懂你这种卡壳的感觉了!传字符串好好的,一到数组就空,确实大概率是作用域搞的鬼——你在函数里新建的局部数组,函数执行完就被系统回收了,到prepare(for:sender:)里根本拿不到。给你一步步捋清楚怎么解决:
1. 把数组“升级”为视图控制器的实例属性
别再把数组放在函数里当局部变量了,把它移到控制器类的顶部,变成整个控制器都能访问的实例属性:
class FirstViewController: UIViewController { // 这里声明数组,类型根据你的需求改(比如[Int]/自定义模型) var myTargetArray: [String] = [] // 剩下的控制器代码... }
2. 在生成数组的函数里给实例属性赋值
原来你可能是在函数里新建let tempArray = [...],现在改成直接给上面的实例属性赋值:
func generateMyArray() { // 替换成你实际生成数组的逻辑(比如解析数据、遍历生成) myTargetArray = ["苹果", "香蕉", "橙子"] }
3. 在prepare方法里传递数组
确保你能正确获取目标控制器,然后把实例数组传过去:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // 替换成你的Segue标识符 if segue.identifier == "GoToSecondVC" { // 强制转换成你的目标控制器类型(比如SecondViewController) guard let destinationVC = segue.destination as? SecondViewController else { print("转换目标控制器失败,检查Segue配置!") return } // 把数组传给目标控制器的接收属性 destinationVC.receivedArray = myTargetArray } }
4. 目标控制器准备好接收属性
别忘了在跳转后的控制器里声明对应的属性,类型要和传递的数组一致:
class SecondViewController: UIViewController { // 声明接收数组的属性,默认值可以根据需求设置 var receivedArray: [String] = [] override func viewDidLoad() { super.viewDidLoad() // 这里就可以正常使用receivedArray了,比如打印验证 print("收到的数组:\(receivedArray)") } }
敲黑板!额外注意点
- 一定要保证生成数组的函数在Segue触发前执行:比如在
viewDidLoad里调用,或者在触发Segue的按钮点击事件里,先执行数组生成再跳转。 - 如果是异步生成数组(比如网络请求、本地文件解析),别用Storyboard里的自动Segue,要等数组加载完成后手动触发:
func fetchDataAsync() { // 模拟异步请求 DispatchQueue.global().async { [weak self] in guard let self = self else { return } // 模拟生成数组的耗时操作 Thread.sleep(forTimeInterval: 2) self.myTargetArray = ["异步生成的元素1", "元素2"] // 回到主线程触发Segue DispatchQueue.main.async { self.performSegue(withIdentifier: "GoToSecondVC", sender: nil) } } }
内容的提问来源于stack exchange,提问作者nc14
相关产品推荐
相关产品推荐

