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