我遇到问题,找不到任何解决方案。

基本上,我有一个UITableview,单元格的内容只是一个UITextField。我通过单击按钮向此表视图添加另一行。在这里,我向计数器加1,该计数器在tableView中显示“numberOfRowsInSection”。因此,基本上计数器在第3个开头,所以在开头有3个文本字段。现在,我可以通过增加计数器来动态添加另一行。按下按钮后,表格视图将重新加载其数据。

因此,这是一个代码段。

@IBAction func addPlayer(_ sender: UIButton) {
    counterPlayer += 1
    tableView.reloadData()
    tableViewScrollToBottom(animated: true)
}



func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return counterPlayer
}


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "PlayerTableViewCell", for: indexPath) as! PlayerTableViewCell
    cell.tag = indexPath.row + 1

    cell.playerTextField.placeholder = "Spieler " + String(indexPath.row + 1)

    return cell
}

它工作得很好,但是如果我在第一个文本字段中写一些东西,增加很多行,然后开始滚动,则随机文本字段的内容与第一个文本字段相同。同样,第一个文本字段的内容也将随机移动到其他文本字段。这是一个gif,因此您可以更好地想象。

ios - Uitableviewcell内容在滚动时移动-LMLPHP

我认为问题出在“dequeueReusableCell”,所以当我滚动时,第一个文本字段将消失,因此它们将被重用,并且仍然具有旧文本的内容。

不幸的是,当我再次向上滚动时,我不知道保存旧值并显示它们的好方法...
当我不使用reusableCell并仅创建新的唯一单元格时,可以解决此问题,但是我认为这不是一个好的解决方案。
您有什么建议,如何解决我的问题?
我想我需要以某种方式缓存已经填充的内容,然后在向上滚动时再次显示它...但是如何?

要了解我想在这里做什么:
基本上,用户可以输入“玩家名称”,然后点击按钮以执行搜索,并由此开始游戏。因此,当他按下按钮时,所有tableviewcell的文本都应使用数组通过segue传递。
他没有任何玩家人数限制。

期待您的回答。非常感谢!

最佳答案

您可以通过覆盖prepareForReuseUITableViewCell方法并清除旧数据来解决此问题。

override func prepareForReuse() {
    super.prepareForReuse()

    // Clear old data to prepare the cell for being reused.
}

更新:要解决未保存的值问题,建议您创建一个数组来保存每个indexPath.row的未保存的数据。

因此,在cellForRow方法中,您将使用indexPath.row中的数组数据设置文本字段的当前文本。完成文本字段的编辑后,将输入的数据保存在该数组中的适当indexPath处。

关于ios - Uitableviewcell内容在滚动时移动,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46613958/

10-12 00:15
查看更多