当编辑一个单元格时,Swift tableview会更改随机单元格的值

时间:2017-09-04 14:32:11

标签: ios swift uitableview

我有很长的文本字段列表,所以我使用的是tableView。

this is how the screen looks like

当我在其中一个单元格的文本字段中插入一些文本并向下滚动其他一些单元格时,会获得相同的文本字段值。我不知道为什么会这样。

这是我现在的代码:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath) as! RelatieToevoegenCell
    cell.label.text = items[indexPath.row]
    cell.textfield.placeholder = items[indexPath.row]
    return cell
}

2 个答案:

答案 0 :(得分:2)

您的主要问题是您将数据保存在Views(UITableVieCell)中。

UITableView可以重复使用单元格来优化性能 - 所以即使你的表中有1milion行,内存中只有少数UITableViewCells(通常在屏幕上可见的数量)。

当您呼叫dequeueReusableCell时,它会占用一个已存在的单元格并重复使用它。

要解决此问题,您需要将数据单独保存在数组中并在其中保留修改后的文本。 然后你需要修改你发布的代码,每次从你的" dataSource"配置UITableView时获取数据。

另一个好的方法是重置UITableViewCell,你可以通过在prepareForReuse内添加编码来实现这一点 - 但这是可选的,因为文本将从你的数据源设置反正。

我还建议你在开始进一步编码之前阅读它 - 它将允许理解UITableView如何在iOS上运行:

https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/TableView_iPhone/TableViewCells/TableViewCells.html#//apple_ref/doc/uid/TP40007451-CH7-SW1

答案 1 :(得分:0)

基本上,您必须在view-controller中获取并存储值,因为UITableViewCell的可重用行为导致您丢失了包含所有子引用的不可见单元格的引用。

因此,您可以通过RelatieToevoegenCell类中的textViewDidChange操作存储文本字段值。