>我在自定义单元格中有一个按钮,它在按下后会更改图像,但是每当触发重新加载时,新添加的单元格都会更改图像而不是旧图像。这是我的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)
}
}
在添加新行之前,它可以正常工作。我尝试将按钮标签设置为与单元格标签相同的按钮标签,但没有帮助。有谁知道解决这个问题的方法?
谢谢。
因为单元格被重用,尝试在cellForRowAt:
中设置图像,因此您需要在模型中有一个布尔值(选择与否(,您必须使用委托进行触摸,并在控制器中实现它,因此您可以在索引和重新加载表视图中更改模型,我提供了示例代码
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
您需要在 每次调用委托方法时cellForRowAt indexPath:
委托方法。因此,您应该将按钮的状态存储在某个地方,它可以是数组或 plist。
您将项目存储在数组中,我可以建议var isLiked: Bool
向其添加一个属性,并且您应该在按下按钮后更改该属性,并根据该属性,您应该在cellForRowAt indexPath:
方法中设置选中或未选中的图像