У меня есть UITableView с UITableViewCells, который содержит UITextView.И у меня есть логика для временных данных и сохраненных данных.Таким образом, когда пользователь редактирует эти ячейки, все работает, включая отмену изменений, которые я делаю с обменом временными данными и сохраненными данными.Затем я делаю reloadData в табличном представлении, и все отображается правильно.
Моя проблема заключается в том, что пользователь нажимает на текстовое поле и прокручивает табличное представление, пока ячейка "активного" текстового представления не станет видимой, а затем изменения будут отменены.Что происходит, так это то, что все отбрасывается, но активная ячейка имеет последние данные, которые не отбрасываются.Если я наведу «курсор» на другую ячейку, а затем снова откажусь от изменений, все будет в порядке, все неактивные ячейки будут отбрасывать данные.
Таким образом, удаление данных не работает только для ячейки, котораяне виден, но все еще имеет активное uitextview.
Я попытался получить «последнюю» активную ячейку и вручную перезагрузить их, но это не работает.Я пытался выполнить resignFirstResponder () из таблицы и затем отбрасывать данные и перезагружать таблицу, но она не работает.
Я ожидаю, что во всех текстовых представлениях внутри таблицы есть старые данные, которые не сохраняются при нажатии discard changes
.
Ячейка, которая все еще активна (с активным просмотром текста) и не видна на экране, не отменяет изменения, у нее все еще будут старые данные (но она больше не будет активной)
РЕДАКТИРОВАТЬ:
Вот как все работает.Вот как работает мой код (очень упрощенно).
Итак, у меня есть
ViewModel -> ViewController -> Cell
На ViewModel у меня есть:
var data = ["Some", "things", "are", "good"]
tempData = []
на init
Я положил tempData = data
(мы здесь говорим о структурах, так что типы значений, и все работает, как я уже говорил об этом)
на cellForRow
У меня есть
cell.data = viewModel.data[indexPath.row]
и, если я нажму, отменить изменения в viewController, я просто сделаю это в viewModel:
data = tempData
и в ViewController
tableView.reloadData()
и все работает.
Единственное, что не работает, - это активная ячейка, которой нет на экране.На него не влияют изменения в «основном» наборе данных.
Так, может быть, есть какое-то соединение с UITableView, которое не может обновить ячейки, которые имеют активный UITextView и не видны в момент reloadData ()?Я не знаю об этом.
EDIT2: cellForRow
guard let cell: ExampleTableViewCell = tableView.dequeueReusableCell(),
let data = viewModel.data[safe: indexPath.row] else {
return UITableViewCell()
}
cell.model = (name: data.name, surname: data.surname)
cell.onTextViewDidChange = { [weak self] text in
self?.tableView.beginUpdates()
self?.tableView.endUpdates()
UIView.setAnimationsEnabled(true)
self?.viewModel.update(text: text, index: indexPath.row)
}
return cell