UITableViewCell中的按钮在重新加载后未保持附加到初始单元格



>我在自定义单元格中有一个按钮,它在按下后会更改图像,但是每当触发重新加载时,新添加的单元格都会更改图像而不是旧图像。这是我的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:方法中设置选中或未选中的图像

相关内容

  • 没有找到相关文章

最新更新