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

Swift:控制器间传递CoreData时触发致命错误

解决Core Data实体传递时的nil解包致命错误

我来帮你排查并解决这个问题,你遇到的Unexpectedly found nil while unwrapping an Optional value崩溃,主要是因为代码里存在多处强制解包的风险,以及对可选值的处理不够严谨,我们一步步来修复:

1. 优化源控制器的Segue传递代码,避免强制解包

原代码里直接强制解包tableView.indexPathForSelectedRow?.row,如果因为某些原因(比如Segue不是通过单元格点击触发、没有选中行)导致indexPathForSelectedRow为nil,就会直接崩溃。我们改用可选绑定来安全获取值:

// in customerTableViewController:
import CoreData
var customer: [Customer] = []

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // 用guard语句层层验证,确保所有条件都满足才执行传递逻辑
    guard segue.identifier == "showCustomerOrderList",
          let selectedIndexPath = tableView.indexPathForSelectedRow,
          // 安全转换目标控制器类型
          let targetVC = segue.destination as? customOrderListTableViewController else {
        return
    }
    // 此时selectedIndexRow一定有值,安全访问数组元素
    targetVC.customer = customer[selectedIndexPath.row]
}

2. 修改目标控制器的属性定义,优雅处理可选值

原代码里把customer定义为隐式解包可选类型Customer!,一旦传递失败就会在viewDidLoad里崩溃。我们改成普通可选类型,并在使用前做非空判断:

// in customOrderListTableViewController:
import CoreData
// 改成普通可选类型,避免隐式解包的风险
var customer: Customer?

override func viewDidLoad() {
    super.viewDidLoad()
    // 用guard语句获取非空的customer,否则做容错处理
    guard let receivedCustomer = self.customer else {
        print("未接收到Customer数据")
        // 可以添加友好的错误提示,比如弹出弹窗,或者返回上一页
        navigationController?.popViewController(animated: true)
        return
    }
    // 此时receivedCustomer一定有值,安全访问属性
    print("\(receivedCustomer.customerName)")
}

3. 检查Storyboard的配置是否正确

除了代码问题,还要确认Storyboard的配置没有出错:

  • 确认Segue的标识符完全匹配showCustomerOrderList(Swift是大小写敏感的,注意不要写错大小写)
  • 确认Segue是从customerTableViewController的单元格拖到目标控制器,确保点击单元格时能正确触发Segue
  • 确认目标控制器的Class在Identity Inspector里设置为customOrderListTableViewController,没有拼写错误

经过以上三步修改,就能彻底避免nil解包的崩溃,同时让代码的健壮性大大提升。

内容的提问来源于stack exchange,提问作者Tech HiMi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:51:50