swift - 放弃 UITableView 内的更改不会反射(reflect)在 UITextView 不可见但处于事件状态的单元格上

标签 swift uitableview uitextview

我有 UITableView 和包含 UITextView 的 UITableViewCells。我有临时数据和保存数据的逻辑。因此,当用户编辑该单元格时,一切正常,包括放弃我通过交换临时数据和保存的数据所做的更改。然后我在 TableView 上重新加载数据,一切都正确显示。

我的问题是,当用户单击文本字段并滚动 TableView ,直到“事件” TextView 单元格不可见,然后放弃更改。发生的情况是所有数据都被丢弃,但事件单元具有未丢弃的最新数据。如果我将“光标”放在其他某个单元格上,然后再次丢弃更改,那就可以了,所有不活动的单元格都会丢弃数据。

因此,丢弃数据不仅仅适用于不可见但仍具有事件 uitextview 的单元格。

我尝试获取“最新”事件单元格并手动重新加载它们,但它不起作用。我尝试从 tableview 中 resignFirstResponder() ,然后丢弃数据并重新加载 tableview 但它不起作用。

我希望 TableView 中的所有 TextView 都包含当我单击放弃更改时不会保存的旧数据。

仍然处于事件状态(具有事件 TextView )且在屏幕上不可见的单元格不会放弃更改,它仍然具有旧数据(但不再处于事件状态)

编辑:

这就是一切的运作方式。 这是我的代码的工作原理(非常简单)。

所以,我有

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() 时不可见的单元格的连接?我不知道这个。

编辑2: 单元格行

        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

最佳答案

UITableView 的一个关键功能是它一遍又一遍地重用单元格的相同实例,只保留模拟无限实例所需的唯一实例。请注意,在 tableView(_: cellForRowAt: ) 中,您不初始化单元格,而是将其出列。这是因为 UIKit 管理单元何时首次初始化以及何时“回收”,因此 Android 上的 RecyclerView

如果无法查看您的代码,我猜问题是您的临时数据存储在单元格实例内,当单元格滚动到屏幕外时,您的 tableView(_ : cellForRowAt) 函数告诉单元格显示不同单元格的数据并且不保存临时数据。如果是这种情况,我的修复建议是将临时数据存储在 UIViewController 中,而不是存储在单元格中。将此类数据存储在 Controller 中而不是 View 中也是更好的 MVC。

关于swift - 放弃 UITableView 内的更改不会反射(reflect)在 UITextView 不可见但处于事件状态的单元格上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55727801/

相关文章:

swift - 显式展开可选的 nil 不会导致崩溃

ios - 如何创建自定义委托(delegate)方法,如 tableView cellForRowAtIndexPath 方法,它有 tableView 的争论?

ios - 无法在 Collection View 中创建单元格?

iOS - 在 UITextView 中编辑文本会更改属性

swift - 如何让 UIScrollView 滚动其中的所有内容

ios - SKSpriteNode 子类 : method to remove all joints

ios - 背景上的 SCNNode 大图像导致崩溃

arrays - 提取数组中的 tableViewCell 宽度?

swift - 单击 UITableView 时没有任何反应(尝试在 View 之间发送数据)

ios - Text大于Height时如何增加UITextView的高度