【问题标题】:Swift tableview changes the value of a random cell when one cell is edited编辑一个单元格时,Swift tableview会更改随机单元格的值
【发布时间】:2017-09-04 14:32:10
【问题描述】:

我有很长的文本字段列表,所以我使用的是 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
}

【问题讨论】:

  • 如何处理文本字段的编辑?请提供更多背景信息。
  • @DávidPásztor 目前我没有对文本字段做任何事情,我只是输入其中一个,当我向下滚动时,不同单元格中的其他文本字段会得到相同的文本

标签: ios swift uitableview


【解决方案1】:

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

UITableView 重用单元格以优化性能 - 因此,即使您的表格中有 100 万行,内存中也只有少数 UITableViewCells(通常在屏幕上可见的数量)。

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

要解决此问题,您需要将数据单独保存在一个数组中,并将修改后的文本保存在那里。 然后你需要修改你发布的代码,每次你从你的“数据源”配置 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

【讨论】:

    【解决方案2】:

    基本上,您必须在视图控制器中获取和存储值,因为由于UITableViewCell 的可重用行为,您丢失了不可见单元格的引用以及所有子引用。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-19
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      相关资源
      最近更新 更多