如何通过Segue传递PHAssets数组至另一ViewController?报错求助
解决PHAsset数组传递时的NSInvalidArgumentException异常
咱们一步步拆解问题,找到崩溃原因并修复:
1. 移除冗余且危险的类型转换
你在prepare(for:sender:)里的类型转换完全没必要,反而可能触发崩溃:
// 你的原有写法(存在风险) (segue.destination as! ViewControllerGame).SelectedAssetsGame = (SelectedAssets as AnyObject) as! [PHAsset] // 替换成安全且简洁的写法 if let gameVC = segue.destination as? ViewControllerGame { gameVC.SelectedAssetsGame = SelectedAssets }
强制解包as!一旦遇到类型不匹配(比如segue指向了错误的控制器),就会直接抛出异常。用可选绑定as?既能安全判断目标控制器类型,又能避免崩溃,还能帮你快速排查segue配置是否出错。
2. 确认segue标识符完全匹配
检查Storyboard里的segue标识符SegueToViewControllerGame,确保和代码里的拼写、大小写完全一致——标识符不匹配的话,传递逻辑根本不会执行,后续如果依赖这个数组做操作,很可能触发异常。
3. 优化PHAsset数组的赋值逻辑
在BSImagePicker的finish回调里,你不需要循环逐个添加,直接替换数组更稳妥,还能避免重复选择时数组无限累加的问题:
finish: { (assets: [PHAsset]) -> Void in self.SelectedAssets = assets // 打印日志确认是否正确获取到资产 print("成功选中\(assets.count)张图片") }
添加日志可以帮你验证回调是否正常执行,数组是否有内容。
4. 确保segue触发时机合理
如果btnStartGame是触发segue的按钮,建议在点击事件里加个前置判断,避免用户未选图片就进入下一页:
@IBAction func btnStartGameTapped(_ sender: UIButton) { guard !SelectedAssets.isEmpty else { lblStatus.text = "请先选择图片哦!" return } // 如果按钮是直接关联segue的,这步可以省略,只保留提示逻辑 performSegue(withIdentifier: "SegueToViewControllerGame", sender: self) }
最后排查崩溃细节
如果还是崩溃,去Xcode的崩溃日志里看具体调用栈——最常见的原因就是segue.destination不是你预期的ViewControllerGame,这时候用可选绑定的写法会直接跳过赋值逻辑,不会崩溃,你也能快速定位到segue配置的问题。
内容的提问来源于stack exchange,提问作者MFrnr
相关产品推荐
相关产品推荐

