Swift - uitableview 重用单元格时用户输入混淆?

Posted

技术标签:

【中文标题】Swift - uitableview 重用单元格时用户输入混淆?【英文标题】:Swift - User input mixed up when uitableview reuses cells? 【发布时间】:2015-09-01 19:56:42 【问题描述】:

我目前正在开发一个应用程序,该应用程序具有 UITableView 和包含 UITextField 的自定义单元格。我遇到的问题是,在用户向文本字段输入数字后,滚动时,tableView 会重用该单元格,并且用户之前的输入会在新单元格中初始化。例如,如果我将数字 7 放在顶部单元格的文本字段中,当我滚动时,最新的单元格中已经有一个 7。我想知道如何解决这个问题?感谢您的帮助。

编辑:由于我的问题不清楚,我基本上需要一种方法让我的 UITableViewCell 与我的 UITableViewController 中的模型“对话”,这样当用户完成编辑单元格中的 UITextField 时,我可以将输入保存到我的视图控制器中的数组。再次感谢

【问题讨论】:

保存该索引路径的条目并在 cellForRow 中设置文本字段 【参考方案1】:

在您的单元格子类中覆盖 -prepareForReuse

在该方法中,将您的文本设置为nil,然后调用super.prepareForReuse

【讨论】:

这个为我节省了很多时间。很少,谢谢,伙计。【参考方案2】:

快速解决方法是创建一个整数数组来表示表中的数字。 然后,在 cellForRowAtIndexPath 方法中,只需执行类似

的操作
cell.textField.text = numberArray[indexPath.row]

您现在需要将文本字段数据实际保存到此数组中,使用相同的方法添加

cell.textField.addTarget(self, action: "onTextChanged:", forControlEvents: UIControlEvents.EditingChanged)

像这样创建 ,,onTextChanged'' 方法

func onTextChanged(sender: UITextField) 
    let cell = sender.superview! as! UITableViewCell
    let indexPath = self.tableView.indexPathForCell(cell)!
    numberArray[indexPath.row] = sender.text.toInt()!

【讨论】:

用户完成文本字段编辑后,如何从 UITableViewCell 更新 numberArray?我知道我可以使用 textfield 委托方法,但是如何从 UITableViewCell 类访问 numberArray? 添加了操作方法:) 这意味着您的文本字段直接放在单元格中,如果它在某个容器内,您需要添加另一个.superview!检索单元格等。 我的 UITableViewController 类中的 onTextChanged 也是如此吗?感谢大家的帮助 是的。这整个 addTarget 东西告诉文本字段在当前类中触发 onTextChanged 方法(开头是 self)。 是的,它适用于从 UIControl 继承的任何东西。您甚至可以自己继承 UIControl 来创建自己的小部件并在它们上使用相同的语法。

以上是关于Swift - uitableview 重用单元格时用户输入混淆?的主要内容,如果未能解决你的问题,请参考以下文章

如何不在 UICollectionView 中重用单元格 - Swift

单元格重用后 UITableView 不更新 UIButton

UITableView - 在编辑模式下重用单元格

UITableView 和单元格重用

UITableView 单元格中的可重用单元格存在问题

重用 uitableview 单元格以及单元格中的子视图