EXC_BAD_ACCESS (код = EXC_I386_GPFLT), когда deleteRows (в: [IndexPath]) - PullRequest
0 голосов
/ 31 августа 2018

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

1 Ответ

0 голосов
/ 31 августа 2018

Не так убежден, но я решил таким образом:

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)

как пакетное обновление. И в завершении блока я вызвал перезагрузку, с другими вещами. Пока все нормально. Надеюсь, это кому-нибудь пригодится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...