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
相关产品推荐
相关产品推荐

