更改集合视图中的单个 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()
}
我目前正在使用 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()
}