ios - 删除行时的 EXC_BAD_ACCESS(代码=EXC_I386_GPFLT)(在:[IndexPath])
问题描述
我正在开发一个在主屏幕上有一个主表视图的应用程序。当我点击表格视图的某种类型的单元格时,我会做一些动画,然后删除该单元格。我在所有模拟器上尝试了这种行为。只有在 4,7" 和 5,5" 上,当我尝试系统地删除某一行时,我才会崩溃。我无法理解错误,因为 Xcode 只说:EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
这是我的代码:
tableView.deselectRow(at: indexPath, animated: false)
let incomingReminderTableViewCell = cell as! IncomingReminderTableViewCell
self.tableView.isUserInteractionEnabled = false
incomingReminderTableViewCell.completeReminderAt(indexPath: indexPath) { (indexPath) in
let selectedReminder = self.incomingReminders.reversed()[indexPath.row-1]
if CoreDataManager.sharedInstance.delete(selectedReminder) {
UserNotificationManager.decreaseBadge()
UserNotificationManager.deleteNotificationsWith(identifiers: [selectedReminder.idNotification])
self.incomingReminders = self.incomingReminders.reversed()
self.incomingReminders.remove(at: indexPath.row-1)
self.incomingReminders = self.incomingReminders.reversed()
if self.incomingReminders.isEmpty {
UIView.animate(withDuration: 0.2, animations: {
incomingReminderTableViewCell.alpha = 0.0
}, completion: { (disappeared) in
self.tableView.reloadRows(at: [indexPath], with: .fade )
self.tableView.isUserInteractionEnabled = true
})
} else {
UIView.animate(withDuration: 0.2, animations: {
incomingReminderTableViewCell.alpha = 0.0
}, completion: { (disappeared) in
self.tableView.isUserInteractionEnabled = true
self.tableView.deleteRows(at: [indexPath], with: .right) // HERE THE CRASH
self.incomingReminders = CoreDataManager.sharedInstance.getIncomingReminders()
if self.incomingReminders.count == 5 {
Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false, block: { (timer) in
self.tableView.insertRows(at: [IndexPath(row: self.incomingReminders.count, section: 0)], with: .fade)
timer.invalidate()
})
}
})
}
} else {
self.tableView.isUserInteractionEnabled = true
}
}
当应用程序崩溃时,我有 indexPath = (row: 3, section: 0),这是正确的。DataSource 已正确更新,在 deleteRows 之前我在数组中有两个元素,tableview 中的数据从 indexPath = (row: 1, section: 0) 开始。找不到解决办法。
解决方案
不太相信,但我已经以这种方式解决了:
tableView.performBatchUpdates({
tableView.deleteRows(at: [indexPath], with: .right)
}, completion: { (deleted) in
tableView.reloadData()
self.tableView.isUserInteractionEnabled = true
self.incomingReminders = CoreDataManager.sharedInstance.getIncomingReminders()
if self.incomingReminders.count == 5 {
Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false, block: { (timer) in
self.tableView.beginUpdates()
self.tableView.insertRows(at: [IndexPath(row: self.incomingReminders.count, section: 0)], with: .fade)
self.tableView.endUpdates()
timer.invalidate()
})
}
})
问题是在 tableview 中删除了一定数量的行后,它仍然很脏。其实删除一堆行,滚动,然后继续删除,crash并没有发生。我需要重新加载数据。我放
tableView.deleteRows(at: [indexPath], with: .right)
作为批量更新。在完成块中,我用其他东西调用了重新加载。目前一切似乎都还好。希望这对某人有用。
推荐阅读
- python - 在 Python 中删除具有连续部分重复的元素
- javascript - Promise.all() 带地图,静音
- python - 堆叠和嵌套的 if else 语句不会移动到下一个 if
- android - 如何在外部 Google 地图应用中加载 Android Direction API 结果?
- spring-security - 从网络安全中排除一个 URL
- node.js - NodeJS - 使用包及其来自本地系统的依赖项
- c# - Vlc.DotNet.Core 在流式传输时拍摄快照
- android - 使用 glide 加载图像并在不同的图像视图中使用它而无需再次下载
- python - 获取网页的全部内容(使用 Python 请求)
- maven - 用于分发目的和依赖冲突解决的 sbt 发布(或 publishLocal)VS sbt 程序集