Изменения отмены внутри UITableView не отражаются на ячейке с UITextView, который не отображается, но активен - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть 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

1 Ответ

0 голосов
/ 17 апреля 2019

Одной из ключевых особенностей UITableView является то, что он снова и снова использует одни и те же экземпляры ячеек, сохраняя только столько уникальных экземпляров, сколько требуется для моделирования бесконечных экземпляров. Обратите внимание, что tableView(_: cellForRowAt: ) не инициализирует ячейку, а dequeue. Это связано с тем, что UIKit управляет, когда ячейки инициализируются впервые и когда они «перерабатываются», следовательно, RecyclerView на Android.

Не имея возможности взглянуть на ваш код, я предполагаю, что проблема заключается в том, что ваши временные данные хранятся внутри экземпляра ячейки, и когда ячейка прокручивается за пределы экрана, что-то происходит в вашей функции tableView(_: cellForRowAt), которая сообщает ячейка для отображения данных другой ячейки и не сохраняет временные данные. Мое предложение для исправления, если это так, будет хранить временные данные в вашем UIViewController, а не в ячейке. MVC также лучше хранить такие данные в контроллере, а не в представлении.

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