UITableViewCell中的按钮在重新加载后不会保持连接到初始Cell

时间:2017-06-14 13:29:56

标签: ios iphone swift xcode uitableview

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

在添加新行之前一切正常。我尝试将按钮标签设置为与单元格标签相同,但它没有帮助。有谁知道解决这个问题?

谢谢。

2 个答案:

答案 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:方法中未选择的图片