更改集合视图中的单个 UIButton 图像会影响多个单元格

Changing a single UIButton image in a collection view is affecting multiple cells

我目前正在使用 Collection View 向用户显示事件列表,并且我的每个自定义单元格都有一个按钮,可以邀请用户参加该事件。按下后,按钮图像应变为 newImage.png,表明他们现在正在参加该活动。当我在下面的代码中执行此操作时,按下按钮实际上会更改图片,但是当我向下滚动我的集合视图时, 尚未单击的多个单元格也已更改为 "newImage.png."我怎样才能阻止这种情况发生?

class CustomCell: UICollectionViewCell{

 @IBAction func myButtonAction(sender: UIButton) {
        myButtonOutlet.setImage(UIImage(named: "newImage.png"), forState: UIControlState.Normal)
    }

 @IBOutlet weak var myButtonOutlet: UIButton!
}

集合视图正在重复使用单元格,正如它设计的那样。您应该做的是在您的 cellForItemAtIndexPath 实现中重置图像。

我以前也遇到过这个问题,这很可能是对小区重用造成的。为避免此问题,您可能会尝试做的是在 cellForItemAtIndexPath() 中显式设置单元格的图像,然后向模型中添加一些内容以跟踪用户正在参加的事件。然后,再次在您的 cellForItemAtIndexPath() 中检查模型以查看该单元格上应该有什么按钮,然后相应地进行更改。

您需要将选定的按钮索引存储在 class 中并检查函数中的特定索引

  override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! UICollectionViewCell
cell.backgroundColor = UIColor.blackColor()
if(selectedIndex == indexPath.row){
     myButtonOutlet.setImage(UIImage(named: "newImage.png"), forState: UIControlState.Normal)

  //change background image here also your button code
}
return cell
}

并在完成这些步骤之后。重新加载集合视图。

这最终解决了我的问题。我有一个存储单元格的数组。每个单元格都有一个名为 isAttending 的布尔值。在我的 cellForItemAtIndexPath 方法中,我实现了下面的代码以及函数 switchImage:

 func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    var cell = collectionView.dequeueReusableCellWithReuseIdentifier("CalendarCell", forIndexPath: indexPath) as! CalendarCell

    cell.customButton.layer.setValue(indexPath.row, forKey: "index")
    cell.customButton.addTarget(self, action: "switchImage:", forControlEvents: UIControlEvents.TouchUpInside)

    return cell
}



  func switchImage(sender: UIButton){
    let index : Int = (sender.layer.valueForKey("index")) as! Int
    if (events[index].isAttending == false){
      events[index].isAttending = true
      cell.customButton.setImage(UIImage(named: "isAttending.png"), forState: UIControlState.Normal)
   }else{
      events[index].isAttending = false
      cell.customButton.setImage(UIImage(named: "isNotAttending.png"), forState: UIControlState.Normal)
        }
    self.collectionView.reloadData()
   }