Swift heightForRow с проверкой состояния после удаления ячейки - PullRequest
0 голосов
/ 10 мая 2019

У меня есть проверка источника данных для определения делегата cellHeightForRowAt

Все коды работают хорошо с добавлением ячейки, но без удаления

вот мои коды

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.dataSource.count
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if self.dataSource[indexPath.row].isExclusive {
        return 280.0
    }
    else {
        return 150.0
    }
}

fileprivate func handleCellDeletion(cell: UITableViewCell) {
    let cellIndexPath = self.paymentMethodTableView.indexPath(for: cell)
    guard let indexPath = cellIndexPath else { return }

    self.dataSource.remove(at: indexPath.row)
    self.paymentMethodTableView.beginUpdates()
    self.paymentMethodTableView.deleteRows(at: [indexPath], with: .fade)
    self.paymentMethodTableView.endUpdates()
}

Теперь проблема в том, что всякий раз, когда ячейка удаляется, она снова запускает делегат heightForRowAt, и эта строка кода выбрасывает индекс из исключения диапазона

if self.dataSource[indexPath.row].isExclusive { // <== this will throw exception

Я заметил, что каким-то образом indexPath.строка по-прежнему отражает общую строку до удаления, хотя я уже удалил индекс в своем массиве dataSource перед повторной загрузкойRows

Кто-нибудь может мне помочь, пожалуйста?Что мне здесь не хватает?Спасибо

1 Ответ

0 голосов
/ 10 мая 2019

Вам не нужно звонить beginUpdates() и endUpdates()

fileprivate func handleCellDeletion(cell: UITableViewCell) {
    let cellIndexPath = self.paymentMethodTableView.indexPath(for: cell)
    guard let indexPath = cellIndexPath else { return }

    self.dataSource.remove(at: indexPath.row)
    self.tableView.reloadData()

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