Ios 无法控制单击时单元格的按钮图像更改

Ios 无法控制单击时单元格的按钮图像更改,ios,swift,Ios,Swift,我试图创建一个简单的应用程序,其中表视图中的每个单元格都有一个心脏按钮。如果我点击心脏按钮,它会被填满。不幸的是,每次我点击它,其他细胞中的其他心脏也会被填满。我发现这是由于细胞循环。我尝试了很多不同的方法来解决这个问题,但不确定具体的过程是什么。以下是应用程序的代码: func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

我试图创建一个简单的应用程序,其中表视图中的每个单元格都有一个心脏按钮。如果我点击心脏按钮,它会被填满。不幸的是,每次我点击它,其他细胞中的其他心脏也会被填满。我发现这是由于细胞循环。我尝试了很多不同的方法来解决这个问题,但不确定具体的过程是什么。以下是应用程序的代码:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell:heartcell = tableView.dequeueReusableCellWithIdentifier("heart") as! heartcell

    cell.heartButton.tag = indexPath.row

    cell.heartButton.setImage(UIImage(named: "heartsUnfillled"), forState: UIControlState.Normal)
    cell.heartButton.setImage(UIImage(named: "heartsFilled"), forState: UIControlState.Selected)

    cell.heartButton.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)

    return cell
}

func buttonClicked(sender:UIButton)
{
    let ip = NSIndexPath(forRow: sender.tag, inSection: 0)
    let cell = someTB.cellForRowAtIndexPath(ip) as! heartcell
    cell.heartButton.selected = !cell.heartButton.selected

}

很明显,这些细胞正在被回收利用,这是行不通的。我曾尝试将单元格存储在一个数组中,将它们各自的索引存储在一个数组中,但不管怎样,我仍然会遇到同样的问题,即我无法控制正在填充的心脏。有人知道怎么解决这个问题吗?谢谢

您应该声明一个集合:

var filledHeartSet = Set<NSIndexPath>()

你能试试这个函数吗:didSelectRowatineXpath由于单元格是重复使用的,你不能依靠单元格对象来存储任何状态数据。您需要在其他一些属性(如NSIndexSet)中跟踪选择状态,然后在
cellforrowatinexpath
中使用该属性,我该如何准确地做到这一点,比如将所选单元格的行存储在一个集合中?
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell:heartcell = tableView.dequeueReusableCellWithIdentifier("heart") as! heartcell

    cell.heartButton.tag = indexPath.row

    cell.heartButton.setImage(UIImage(named: "heartsUnfillled"), forState: UIControlState.Normal)
    cell.heartButton.setImage(UIImage(named: "heartsFilled"), forState: UIControlState.Selected)

    cell.heartButton.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)

    // set current state for heart button
    cell.heartButton.selected = filledHeartSet.contains(indexPath)

    return cell
}

func buttonClicked(sender:UIButton)
{
    let ip = NSIndexPath(forRow: sender.tag, inSection: 0)

    // only store filled heart indexPath
    if filledHeartSet.contains(ip) {
        filledHeartSet.remove(ip)
    } else {
        filledHeartSet.insert(ip)
    }

    let cell = someTB.cellForRowAtIndexPath(ip) as! heartcell
    cell.heartButton.selected = !cell.heartButton.selected
}