当前位置: 首页 > 知识库问答 >
问题:

集合视图按钮背景图像在滚动上重复

金皓君
2023-03-14

我有一个集合视图,在集合视图单元格中有一个名为furnitureSelectionBtn的按钮。

当我点击集合视图中的按钮时,它将按钮图像设置为Selected.png。当我再次点击它时,它将被取消选中,我将其设置为unselected.png图像。当我点击按钮时,cardselection方法会被触发,并且我将点击的索引保存在AllFurnituresArray中。

现在,当我滚动这个集合视图时,很少有单元格得到选中的图像,即使我没有选中它们。这种情况通常发生在视图之外的单元格。例如,如果我已经选择了第一个按钮并且我开始滚动,我看到第四个按钮也处于选择状态

因此,我尝试检查cellforRow方法中的allFurnituresArray索引,这些索引是被选中的,但即使这样也不起作用。我还试着看看是否可以使用prepareForReuse(),但是我们没有得到关于我已经滚动到那里的索引的信息。

有人能帮忙吗

CardCollectionViewCell.Swift

class CardCollectionViewCell: SwipingCarouselCollectionViewCell {  
@IBOutlet weak var furnitureSelectionBtn: UIButton!

  static let reuseIdentifier = "CardCollectionViewCell"
    static var nib: UINib {
        get {
            return UINib(nibName: "CardCollectionViewCell", bundle: nil)
        }
    }
  override func awakeFromNib() {
        super.awakeFromNib()
        furnitureSelectionBtn.setBackgroundImage(image, for: UIControl.State.normal)
}

CardViewController.Swift

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CardCollectionViewCell.reuseIdentifier, for: indexPath) as! CardCollectionViewCell
       
        // Configure the cell
        cell.delegate = self
  
        cell.furnitureSelectionBtn.tag = (indexPath as NSIndexPath).row
        for element in allFurnituresArray {
            print(element)
            if (indexPath.row) == element as! Int {
                let image1 = UIImage(named: "selected.png")
                cell.furnitureSelectionBtn.setBackgroundImage(image1, for: UIControl.State.selected)
            }
            else
            {
                let image1 = UIImage(named: "unselected.png") 
                cell.furnitureSelectionBtn.setBackgroundImage(image1, for: UIControl.State.normal)
            }
        }

        cell.furnitureSelectionBtn.addTarget(self, action: #selector(CardViewController.cardselection(_:)), for: .touchUpInside)
  
     
        return cell
    }
@objc func cardselection(_ sender:UIButton!)
           {
        if sender.isSelected == true {
            sender.isSelected = false
            let image1 = UIImage(named: "unselected.png")
        
            sender.setBackgroundImage(image1, for: UIControl.State.normal)
            allFurnituresArray.remove(sender.tag)
          }else {
            sender.isSelected = true
            let image1 = UIImage(named: "selected.png")
            allFurnituresArray.add(sender.tag)
            sender.setBackgroundImage(image1, for: UIControl.State.selected)
          }
               print("Button tapped")
        print(sender.tag)

           }

共有1个答案

年健
2023-03-14

保存选择状态的最佳方法是将此数据添加到datasource数组中的项中,例如,

(1)数据源数组

var items = [Item]()

(2)Didselectem...

items[indexPath.row].isSelected = !(items[indexPath.row].isSelected)

并处理单元格中的选择状态。

 类似资料:
  • 当我滚动时,我的动态数据就像。任何能阻止这一切的方法。我也尝试过取景框,但没有运气。我做错了什么。有人帮忙就好了。预先感谢 公共视图 getView(int position, View convertView, ViewGroup arg2) {

  • 问题内容: 我想知道,当我向下或向上滚动时,我的图像和布局的颜色会乱七八糟,我使用recyclerview创建了cardview。并设置图片(在点击时更改颜色,以了解其用户喜欢的项目),并将setbackgroundcolor(随机选择)设置为父版面,以使Cardview更具吸引力。但是当我滚动1.图像更改位置的图像时,2.布局背景自动更改颜色。 我在这里发布适配器的代码。 } 问题答案: 我已经

  • 问题内容: 我有一个正在编写的CSS页面,我需要在一个类中应用背景图像,然后使用另一个类将一个局部透明的背景图像放在已经存在的背景图像之上。这只是一个简单的字眼,所以让我做一个示范。 在此示例中,第一个div应该具有背景图像1,第二个div应该具有背景图像1,但是滤镜图像位于其顶部,然后第三个div应该是图像2,第四个应该是图像2并且上面具有相同的滤镜。 但是,在此示例中,.backgroundF

  • 问题内容: 我在以下div中有一个背景图片,但是该图片被截断了: 有没有一种方法可以显示背景图像而不将其剪切掉? 问题答案: 您可以使用])属性来实现此目的,大多数浏览器现在都支持该属性。 缩放背景图像以适合div: 要缩放背景图像以覆盖整个div:

  • 问题内容: 我期望以下两个脚本具有相同的输出。 但是执行 脚本1 时,按钮上没有显示图像。但是, 脚本2 效果很好。 脚本1 剧本2 问题答案: 对图像对象的唯一引用是局部变量。当退出时,被当作垃圾回收的局部变量,因此图像被破坏。在第二个示例中,由于映像是在全局级别创建的,因此它永远不会超出范围,因此也不会进行垃圾回收。 要解决此问题,请保存对图像的引用。例如,代替use 。

  • 我取一个imageView,然后取一个CollectionView。我很困惑如何设计单元格,哪些元素在单元格中拖放