Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Tableviewcell内容在滚动时四处移动_Ios_Swift_Uitableview - Fatal编程技术网

Ios Tableviewcell内容在滚动时四处移动

Ios Tableviewcell内容在滚动时四处移动,ios,swift,uitableview,Ios,Swift,Uitableview,我正面临一个问题,我找不到任何解决办法 基本上我有一个UITableview,单元格的内容只是一个UITextField。我正在通过单击按钮将另一行添加到此tableview。这里我向计数器添加1,它在我的表视图中显示“numberOfRowsInSection”。计数器基本上在3开头,所以在开头有3个文本字段。现在我可以通过增加计数器动态添加另一行。按下按钮后,tableview将重新加载其数据 下面是一段代码片段 @IBAction func addPlayer(_ sender: UIBu

我正面临一个问题,我找不到任何解决办法

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

下面是一段代码片段

@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,所以你可以更好地想象

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

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

要了解我想在这里做什么: 基本上,用户可以输入“玩家名称”,然后点击一个按钮来执行一个序列,从而开始游戏。因此,当他点击按钮时,所有tableviewcells的文本都应该通过使用数组的顺序传递。 他没有球员人数限制


我期待着你的回答。非常感谢

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

override func prepareForReuse() {
    super.prepareForReuse()

    // Clear old data to prepare the cell for being reused.
}
更新:为了解决未保存值的问题,我建议您创建一个数组来保存每个
indepath.row
的未保存数据


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

单词“test”从何而来?你展示的代码中没有。哎呀,我没提到。我在running应用程序的文本字段中编写了测试。然后,当我滚动时,它会复制并移动,等等。。。我认为这是因为可重用单元的出列…是的,您需要明确清除
cell.playerTextField
cellForRowAt
UITableViews
单元格出现/消失时的
text
属性。这意味着刚刚消失的单元格将被添加为下一个单元格。如果要基于单元格显示动态文本,需要将其保存在单元格外部,然后根据索引在
cellForRow
中进行设置。首先,可能存在重复,谢谢!但当我清除数据并再次向上滚动时,我如何知道哪个文本字段中有我清除的内容?因为它需要再次设置为那个数据,当我向上滚动时..我会得到它,好主意!非常感谢,我试着意识到:)