我在自定义单元格中有一个按钮,在按下后会更改图像,但每当触发重新加载时,新添加的单元格都会更改图像而不是旧图像。这是我的cellForRowAt:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Sender", for: indexPath) as! Sender
cell.clearCellData()
cell.message.text = self.items[indexPath.row].content
cell.name.text = self.items[indexPath.row].name
cell.from = self.items[indexPath.row].fromID
return cell
}
按钮的插座和操作都在按钮单元格中,如下所示:
@IBAction func downVoted(_ sender: Any) {
if(self.downVote.image(for: .normal) == #imageLiteral(resourceName: "DownGray")){
self.downVote.setImage(#imageLiteral(resourceName: "DownOn"), for: .normal)
}else{
self.downVote.setImage(#imageLiteral(resourceName: "DownGray"), for: .normal)
}
}
在添加新行之前一切正常。我尝试将按钮标签设置为与单元格标签相同,但它没有帮助。有谁知道解决这个问题?
谢谢。
答案 0 :(得分:1)
这可能是因为细胞被重复使用,尝试在cellForRowAt:
中设置图像,这样你需要在模型中使用bool(选择与否),你必须使用委托进行触摸,并实现它在您的控制器中,因此您可以在索引和重新加载表视图中更改模型,我提供示例代码
protocol SenderDelegate {
func downVoteTapped(_ cell: MainTVCell)
}
class Sender: UITableViewCell {
@IBAction func downVoted(_ sender: Any) {
delegate!.downVoteTapped(self)
}
}
和控制器
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Sender", for: indexPath) as! Sender
cell.clearCellData()
cell.delegate = self
cell.message.text = self.items[indexPath.row].content
cell.name.text = self.items[indexPath.row].name
cell.from = self.items[indexPath.row].fromID
if self.items[indexPath.row].selected == true {
self.downVote.setImage(#imageLiteral(resourceName: "DownOn"), for: .normal)
} else {
self.downVote.setImage(#imageLiteral(resourceName: "DownGray"), for: .normal)
}
return cell
}
func downVoteTapped(_ cell: Sender) {
let index = tableView.indexPathForCell(cell)?.row)!
self.items[index].selected == !self.items[index].selected
tableView.reloadData()
}
并且不要忘记SomeViewController: SenderDelegate
并在您的模型中var selected = false
答案 1 :(得分:0)
这是因为您需要设置按钮的状态
每次调用cellForRowAt indexPath:
委托方法。
因此,您应该将按钮的状态存储在某个位置,它可以是数组或plist。
您已将项目存储在数组中,我可以建议向其添加属性var isLiked: Bool
,并且您应该在按下按钮后更改该属性,并且符合您应设置的属性或cellForRowAt indexPath:
方法中未选择的图片