如何保存单元格的状态,以便当我滚动或离开页面时它不会刷新单元格?
Posted
技术标签:
【中文标题】如何保存单元格的状态,以便当我滚动或离开页面时它不会刷新单元格?【英文标题】:How to save the status of a cell so when I scroll or leave the page it doesn't refresh the cells? 【发布时间】:2019-04-23 19:21:10 【问题描述】:我正在尝试建立一个游戏商店,您可以在其中购买不同颜色的球。我开始使用带有所有白球的 UICollectionView,当我单击一个单元格时,它会将白球图像更改为彩色球图像(编辑:来自预制彩色图像数组的图像)。当我向下滚动并向上滚动时,我选择的单元格将重置为白球图像。我显然不想要这个。
我已经尝试使用已经内置在 UICollectionView 类中的方法和 didSelectItemAt 但是当我向下滚动和备份时它变得一团糟(当我选择一个单元格时,一个不同的图像被更改而不是正确的图像)。我尝试在 collectionViewCell 类中使用 isSelected,但我无法在此处获取索引路径,因此无法保存选择了哪些单元格。
override var isSelected: Bool
didSet
if self.isSelected
textImage.image = images[indexPath.item] // I don't know what to put here I don't have the indexPath
else
textImage.image = #imageLiteral(resourceName: "circleWhite")
任何帮助都很棒,我对在 Xcode 中编码还很陌生,因此非常感谢您对这里的操作进行一些解释。
编辑:我有一组图像应该是商店,而不仅仅是一种不同的颜色,多种颜色。当我单击一个单元格时,它应该访问数组中相应索引中的图像并使用该图像替换白色圆圈。
【问题讨论】:
您可以根据需要调整底层数组并重新绘制它。 jessi- 这就是我想要做的,但我无法在不知道我点击的 indexPath 的情况下调整数组。我正在调整我的 UICollectionView 类中的数组,但是在 UICollectionViewCell 类中我无法在没有 indexPAth 的情况下访问特定的数组索引 你能用didselectItemAtPath
(它会给你选择的索引),也许你可以用那个索引值做点什么(存储它)?
【参考方案1】:
在我们的代码中做了同样的事情。下面是解决这个问题的方法。
1.获取一个元组数组来保持选定的状态和特定的颜色或任何你想要的。
var arrColor = [(isSelected:Bool,color:UIColor)]()
2。现在在 cellForItemAt 上执行以下代码。
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
guard let collectionViewCell = self.iconCollectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as? EditDeviceCollectionViewCell else return UICollectionViewCell()
if arrColor[indexPath.item].isSelected
arrColor[indexPath.item].color = .white
else
arrColor[indexPath.item].color = .black
return collectionViewCell
3.现在编写数据源方法并使用下面的颜色
//MARK:- UICollectionViewDelegate
扩展 yourViewController: UICollectionViewDelegate
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
arrColor[indexPath.item].isSelected = true
func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath)
arrColor[indexPath.item].isSelected = false.
快乐编码?
【讨论】:
我编辑了我的问题以提供更多说明。我不希望它只是变成橙色,我希望它变成数组中的特定颜色。一旦我能做到这一点,那么当滚动单元格时,我就可以在重新制作单元格时访问数组中的那个点。很抱歉造成混乱。 感谢您的帮助!!我最终以稍微不同的方式进行操作,但您提供的信息绝对有帮助!【参考方案2】:当您滚出屏幕时,单元格会调用它们的 prepareForReuse。您需要做的是将颜色的状态存储在其他地方 - 例如在 collectionView 或 viewModel 上。当 cellForRow 被调用时,你从保存的状态变量中提取颜色以显示该行。
基本上发生的情况是,当单元格离开屏幕以节省内存时,它们正在被重复使用。因此,当您滚动回它们时,它们通常会以另一个单元格的状态重新创建,因为单元格被重复使用。
【讨论】:
我正在尝试将颜色状态存储在其他地方,但起初都是白色的。然后一旦点击它就会变成不同的图像,一种颜色。以我现在这样做的方式,我有一种方法可以查看是否在 UICollectionViewCell 类中按下了单元格,并且当我在此处注册单击时,我无法访问被单击的单元格的索引路径。因此,当重新制作单元格时,我无法告诉代码哪个单元格要制作某种颜色,因为我不知道索引路径。这有意义吗?还是我做错了……以上是关于如何保存单元格的状态,以便当我滚动或离开页面时它不会刷新单元格?的主要内容,如果未能解决你的问题,请参考以下文章