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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:40:48