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

时间:2015-07-07 14:20:26

标签: ios swift uibutton uicollectionview uicollectionviewcell

我目前正在使用“收藏视图”向用户显示事件列表,每个自定义单元格都有一个按钮,邀请用户参加活动。按下时,按钮图像应该更改为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!
}

4 个答案:

答案 0 :(得分:1)

集合视图正在重复使用单元格,因为它是专门设计的。你应该做的是在你的cellForItemAtIndexPath实现中重置图像。

答案 1 :(得分:0)

我之前也遇到过这个问题,这很可能是细胞重用。您可能尝试避免此问题的方法是在cellForItemAtIndexPath()中明确设置单元格的图像,然后在模型中添加一些内容,以跟踪用户正在参与的事件。然后,再次在cellForItemAtIndexPath()中,检查模型以查看该单元格上应该有哪个按钮,然后相应地更改它。

答案 2 :(得分:0)

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

  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
}

并且在执行此步骤之后。重新加载集合视图。

答案 3 :(得分:0)

这最终解决了我的问题。我有一个数组,我存储我的单元格。每个单元格都有一个名为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()
   }