我有带有UITableViewCells的UITableView,其中包含UITextView。而且我对临时数据和保存的数据有逻辑。因此,当用户编辑该单元格时,一切都将正常进行,包括放弃我在交换临时数据和保存的数据时所做的更改。然后我在表视图上执行reloadData,一切都正确显示。
我的问题是,当用户单击文本字段并滚动表格视图时,直到“活动的”文本视图单元格不可见,然后放弃所做的更改。发生的事情是全部被丢弃,但是活动单元具有未被丢弃的最新数据。如果我将“游标”放在其他某个单元格上,然后再次放弃更改,则可以,所有不活动的单元格都将丢弃数据。
因此,丢弃数据不仅仅在不可见但仍具有有效uitextview的单元上起作用。
我试图获取“最新的”活动单元并手动重新加载它们,但是它不起作用。我试图从tableview中重新签名FirstResponder(),然后丢弃数据并重新加载tableview,但是它不起作用。
我希望表视图中的所有文本视图都具有单击“ 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
答案 0 :(得分:0)
UITableView的主要功能之一是它一次又一次地重用单元格的相同实例,仅保留与模拟无限实例所需的一样多的唯一实例。请注意,如何在tableView(_: cellForRowAt: )
中不初始化单元格,而是dequeue
。这是因为UIKit负责管理何时首次初始化单元格以及何时对其进行“回收”(因此在Android上为RecyclerView
)。
无法查看您的代码,我想问题是您的临时数据存储在单元格的实例内部,并且当单元格滚动到屏幕外时,tableView(_: cellForRowAt)
函数中发生了某些情况它告诉单元格显示其他单元格的数据,并且不保存临时数据。对于这种情况,我的修复建议是将临时数据存储在UIViewController中,而不是存储在单元格中。最好将MVC存储在控制器中而不是视图中。