我正在开发一个在主屏幕上具有主tableview的应用程序。当我点击表格视图的某种类型的单元格时,我做了一点动画,然后删除了该单元格。我尝试了所有模拟器上的行为。仅在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 =(第3行,第0部分)是正确的。在deleteRows之前,DataSource已正确更新,我在数组中有两个元素,而表视图中的数据始于indexPath =(行:1,节:0)。找不到解决方案。
答案 0 :(得分: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.deleteRows(at: [indexPath], with: .right)
作为批量更新。在完成代码块中,我还调用了reload以及其他功能。现在一切都还好。希望这对某人有用。