gpt4 book ai didi

ios - CollectionView 单元格中正常状态的 UIButton 图像每四个单元格重复一次

转载 作者:行者123 更新时间:2023-11-30 11:11:59 26 4
gpt4 key购买 nike

我正在尝试为位于 collectionView 单元格中的按钮的正常状态设置图像。当按下按钮时,图像会发生变化。问题是,当按下按钮时,每四个单元格都会重复与原始单元格相同的图像。有没有办法让它不重复,并且当按下按钮时它仅适用于该单个单元格?

这是代码:

class FavoritesCell: UICollectionViewCell {

var isFavorite: Bool = false

@IBOutlet weak var favoritesButton: UIButton!

@IBAction func favoritesButtonPressed(_ sender: UIButton) {
_ = self.isFavorite ? (self.isFavorite = false, self.favoritesButton.setImage(UIImage(named: "favUnselected"), for: .normal)) : (self.isFavorite = true, self.favoritesButton.setImage(UIImage(named: "favSelected"), for: .selected))

}
}

我尝试过这样做,但由于某些奇怪的原因,即使按下按钮,“选定”状态图像也永远不会显示:

let button = UIButton()

override func awakeFromNib() {
super.awakeFromNib()

button.setImage(UIImage(named: "favUnselected"), for: .normal)
button.setImage(UIImage(named: "favSelected"), for: .selected)
}

最佳答案

每次单元格出队时,都会调用cellForItemAt。这是您配置单元格数据的地方。因此,如果您需要显示标记为收藏的单元格,可以在此处执行。

那么你如何做到这一点呢?假设一开始没有选择所有单元格。美好的。您不必在 cellForItemAt 中说出任何内容。现在假设您将一些单元格标记为收藏夹。这里发生的情况是,当单元格可见时,它将反射(reflect)更改,因为按钮挂接到将进行更改的选择器。

现在问题来了。当您滚动并且单元格消失时,有关您的单元格被标记为收藏夹的信息就会丢失!因此,您需要做的是维护一个数组,该数组将存储所有选定单元格的 IndexPath 。 (当从收藏夹中删除单元格时,请确保删除 IndexPath!)让我们将该数组称为 favourites。如果您可以使用 Collection View 的数据源来存储选定的状态信息,那也很好。现在,您必须在按钮选择器中存储有关您的单元格是否被标记为收藏夹的信息。

@objc func buttonTapped() {
if favourites.contains(indexPath) { // Assuming you store indexPath in cell or get it from superview
favourites.removeAll(where: {$0 == indexPath})
} else {
favourites.append(indexPath)
}
}

存储有关单元格的信息后,每次将单元格出列时,都需要检查IndexPath是否为favourites。如果是,则调用将单元格设置为选定状态的方法。

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
// Dequeue cell and populating cell with data, etc
if favourites.contains(indexPath) {
cell.showFavourite()
}
}

完成了吗?不!现在我们有另一个问题。此问题与单元的重用有关。那么 cellForItemAt 实际上发生了什么?您将单元出列并使用它来显示信息。因此,当您将其出列时,发生的情况是,它可能已用于显示其他索引路径中的其他信息。因此,现有的所有数据都会持续。 (这就是为什么你会遇到收藏夹每 4 个单元格重复一次的问题!)

那么我们该如何解决这个问题呢? UICollectionViewCell 中有一个方法,在单元格出队之前被调用 - prepareCellForReuse。您需要在单元格中实现此方法,并删除单元格中的所有信息,以便在到达 cellForItemAt 时它是最新的。

func prepareForReuse() {
//Remove label text, images, button selected state, etc
}

或者您始终可以在 cellForItemAt 中设置单元格内所有内容的每个值,以便每个信息始终被必要的值覆盖。

编辑:OP说他在 Collection View 中有一个 Collection View 。您可以像这样识别哪个 Collection View 被调用,

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

if collectionView === favoriteCollectionView { // This is the collection view which contains the cell which needs to be marked as favourite
// Dequeue cell and populating cell with data, etc
if favourites.contains(indexPath) {
cell.showFavourite()
}
return cell
}
// Dequeue and return for the other collectionview
}

关于ios - CollectionView 单元格中正常状态的 UIButton 图像每四个单元格重复一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52100899/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com