Я занимаюсь разработкой приложения, которое имеет основной вид таблицы на главном экране. Когда я нажимаю на ячейку определенного вида таблицы, я делаю небольшую анимацию и затем удаляю ячейку. Я попробовал поведение на всем симуляторе. Только на 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), это правильно. DataSource был правильно обновлен, до deleteRows у меня есть два элемента в массиве, и данные в табличном представлении начинаются с indexPath = (строка: 1, раздел: 0). Не могу найти решение.