单击

时间:2015-12-26 01:54:38

标签: ios swift

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

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

}
显然,细胞正在被回收利用,而且这种情况并不起作用。我已经尝试将单元格存储在一个数组中,将它们各自的索引存储在一个数组中,但无论如何我仍然会遇到同样的问题,我无法控制那些被填充的心脏。有人知道如何解决这个问题吗?谢谢!

1 个答案:

答案 0 :(得分:0)

你应该声明一个集合:

var filledHeartSet = Set<NSIndexPath>()

并在您的代码中使用它:

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
}