SQLite.swift:激活搜索时点击UITableViewCell致APP崩溃(解包nil)
解决iOS11真机搜索状态下点击TableViewCell崩溃的问题
嘿,我来帮你捋捋这个崩溃的事儿——之前我也碰过iOS11真机和模拟器行为不一致的坑,咱们一步步拆解根源,再给你针对性的修复方案。
首先,你看到的SQLite.swift里的unwrap nil错误,其实是连锁反应:真正的问题出在DetailViewController里那行用try!和cell?.textLabel?.text的查询代码上,而且真机和模拟器的差异大概率是因为搜索状态下,真机的cell文本或者数据库查询结果出现了nil,而你用了强制解包直接触发了崩溃。
第一步:先定位到底哪个值是nil
你可以先把崩溃的代码拆开来排查,别一股脑写在一行:
- 先打印
cell?.textLabel?.text和cell?.detailTextLabel?.text:在跳转前加一行print("Cell主文本:\(cell?.textLabel?.text ?? "nil"),副文本:\(cell?.detailTextLabel?.text ?? "nil")"),看看真机搜索状态下这俩值是不是变成nil了。大概率是搜索过滤后的cell赋值有问题,或者数据源切换时没处理好。 - 然后看
database.scalar()的返回值:这个方法如果查不到匹配的数据,会返回nil,而你用try!不仅忽略了数据库可能抛出的错误,还强制解包了这个可能为nil的结果,这绝对是崩溃的高危点。
第二步:针对性修复方案
1. 把所有强制解包都换成安全的可选绑定
永远别用try!处理数据库查询——除非你能100%保证每次都能查到结果。改成下面这样的安全写法:
// 先确保cell的文本不为空 guard let cellMainText = cell?.textLabel?.text, let cellDetailText = cell?.detailTextLabel?.text else { print("Cell文本为空,无法执行查询") return } // 用do-catch处理数据库操作,避免强制解包 do { // scalar返回可选值,用if let接收 if let bankName = try database.scalar(table.filter(tableColumnName == cellMainText && tableColumnDate == cellDetailText).select(bankName)) { // 拿到有效结果,继续后续逻辑 print("查询到银行名称:\(bankName)") } else { // 没有匹配结果的处理 print("没有找到对应日期和名称的银行记录") } } catch { // 捕获数据库错误 print("数据库查询出错:\(error.localizedDescription)") }
2. 别用cell文本查数据库,直接传模型更靠谱
搜索状态下,你的tableView肯定用了过滤后的数据源,与其用cell的文本去查库(既低效又容易出nil),不如直接把对应位置的模型对象传给DetailViewController:
- 先定义两个数据源数组:
var originalBankData: [BankModel] = [](原始数据),var filteredBankData: [BankModel] = [](搜索过滤后的数据) - 搜索时更新
filteredBankData,tableView的数据源根据搜索状态切换:isSearching ? filteredBankData : originalBankData - 点击cell时,直接取对应位置的模型:
let selectedBank = isSearching ? filteredBankData[indexPath.row] : originalBankData[indexPath.row] // 把selectedBank传给DetailViewController,比如用属性或者闭包 detailVC.selectedBank = selectedBank
这样不仅彻底避免了cell文本nil的问题,还省去了一次数据库查询,性能也更好。
3. 排查iOS11真机的特殊布局问题
iOS11的UITableView在搜索状态下,cell复用或者自动布局可能有奇怪的行为:
- 检查
cellForRowAt方法,搜索状态下是不是正确给textLabel和detailTextLabel赋值了?有没有因为复用导致文本被清空的情况? - 有没有开启iOS11的tableView自动高度(
estimatedRowHeight),导致cell布局异常,文本没有正确渲染出来?
第三步:验证修复效果
改完之后,在真机上测试搜索状态下的cell点击:
- 先确认跳转前的模型数据或者cell文本不为nil
- 确认数据库查询用了do-catch和可选绑定,不再有任何强制解包的操作
这样应该就能解决你遇到的崩溃问题了。
内容的提问来源于stack exchange,提问作者Aeger
相关产品推荐
相关产品推荐

