我正在尝试创建一个简单的应用程序,其中表视图中的每个单元格都有一个心形按钮。如果我点击心形按钮,它应该被填满。不幸的是,每次点击它,其他单元格中的其他心脏也会被填满。我发现这是由于细胞回收造成的。我尝试过很多不同的尝试来解决这个问题,但我不确定具体的过程是什么。以下是该应用的代码:
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
}
显然,细胞正在被回收利用,而且这种情况并不起作用。我已经尝试将单元格存储在一个数组中,将它们各自的索引存储在一个数组中,但无论如何我仍然会遇到同样的问题,我无法控制那些被填充的心脏。有人知道如何解决这个问题吗?谢谢!
答案 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
}