Индекс вне диапазона при удалении ячейки - PullRequest
0 голосов
/ 08 июня 2018

Привет и надеюсь, вы поможете.

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

cell.tableViewClosure = {[unowned self] in
    self.tableView.beginUpdates()
    // Singleton
    Strings.shared.strings[indexPath.row] = cell.textField.text!
    self.tableView.reloadRows(at: [indexPath], with: .automatic)
    self.tableView.endUpdates()
}

В качестве экземпляра я удаляю первую ячейку, количество массивов данных и количество строк равны после этого в журнале, но если я пытаюсь редактировать текстовое поле в последней ячейке и нажимаювозврат, приложение вылетает с индексом вне диапазона.

Если журнал во время удаления - это 5 строк в массиве, но indexPath.row для этой правильной ячейки равен 5.

Но если я перезагружаю данные в удалении - все нормально с редактированием последней ячейки, ноПользовательский интерфейс не является гладким.

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Ваша проблема в том, что indexPath.row фиксируется, когда вы назначаете закрытие, для вашей последней ячейки оно будет иметь значение "4".Если впоследствии вы удалите более раннюю ячейку, последний элемент в вашем массиве теперь будет «3», но захваченное значение не изменится;оно равно 4.

Когда вы затем редактируете текстовое поле в последней ячейке, захваченное значение 4 используется для доступа к вашей модели, и вы получаете исключение границ массива.

Вы можете использовать indexPath(for:) для определения подходящего пути индекса при выполнении замыкания:

cell.tableViewClosure = {[unowned self] in
    if let indexPath = self.tableView.indexPath(for: cell) {
        self.tableView.beginUpdates()
        Strings.shared.strings[indexPath.row] = cell.textField.text!
        self.tableView.reloadRows(at: [indexPath], with: .automatic)
        self.tableView.endUpdates()
    }
}
0 голосов
/ 08 июня 2018

indexPath.row начинается с 0. Таким образом, диапазон будет 0-4.Если вы используете 5 строк в массиве и используете .count - это вернет 5.

Просто выполните indexPath.row - 1, чтобы скорректировать значение off на 1 (индекс вне диапазона).

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