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

Swift中如何通过Segue将JSON数组传递到其他视图控制器并填充PickerView

解决JSON数组传递到PickerView的问题

看起来你遇到的核心问题是类型不匹配导致数组没能成功传递到目标视图控制器,咱们一步步来修复:

问题分析

  1. 你在发送端把mydata(NSArray类型)转成了[NSArray]类型的sendData,但在prepare(for:sender:)方法里,却尝试把sender强转为[String]——这两种类型完全不匹配,所以转换失败,目标VC的dept数组始终是空的。
  2. 混用了Objective-C的NSArray和Swift原生数组,容易造成类型混乱,建议统一用Swift的类型系统。

解决方案

首先得明确你JSON里"data"字段的结构,分两种情况处理:


情况1:"data"是一维字符串数组(比如["部门1", "部门2", "部门3"])

第一步:发送端(原ViewController)调整代码
// 安全解析JSON数据,避免强制解包崩溃
guard let mydata = json["data"] as? [String] else {
    print("解析data字段失败,不是[String]类型")
    return
}
print("My Data is \(mydata)")
// 直接传递[String]类型的数组
self.performSegue(withIdentifier: "checkLoginViewController", sender: mydata)
第二步:修正prepareSegue方法
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // 确保目标VC是SignupViewController,且sender是[String]类型
    if let destinationVC = segue.destination as? SignupViewController, 
       let sendData = sender as? [String] {    
        destinationVC.dept = sendData    
    }    
}

情况2:"data"是二维数组(比如[["部门1"], ["部门2"], ["部门3"]])

发送端代码
// 安全解析为二维字符串数组
guard let mydata = json["data"] as? [[String]] else {
    print("解析data字段失败,不是[[String]]类型")
    return
}
print("My Data is \(mydata)")
self.performSegue(withIdentifier: "checkLoginViewController", sender: mydata)
修正prepareSegue方法(适配PickerView需求)

如果PickerView需要一维字符串数组,你可以把二维数组扁平化:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let destinationVC = segue.destination as? SignupViewController, 
       let sendData = sender as? [[String]] {    
        // 把二维数组转成一维,给PickerView用
        destinationVC.dept = sendData.flatMap { $0 }
    }    
}

额外建议

  • 尽量避免用!强制解包,用guard let或if let做安全解析,防止因为JSON结构变化导致崩溃。
  • 目标VC的dept数组可以设置为可选类型(var dept: [String]?),或者初始化空数组,避免未初始化的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:14:56