如何保存单元格的状态,以便当我滚动或离开页面时它不会刷新单元格?

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 类中按下了单元格,并且当我在此处注册单击时,我无法访问被单击的单元格的索引路径。因此,当重新制作单元格时,我无法告诉代码哪个单元格要制作某种颜色,因为我不知道索引路径。这有意义吗?还是我做错了……

以上是关于如何保存单元格的状态,以便当我滚动或离开页面时它不会刷新单元格?的主要内容,如果未能解决你的问题,请参考以下文章

滚动时collectionview更改单元格背景图像

保存 UITableView 数据?

如何在滚动时将单元格的内容保留在屏幕上,直到单元格用完可用空间?

选择单元格时 UICollectionView 正在滚动

当我滚动时,TableView 只加载一个单元格的内容

将单元格中的 UITextField 文本保存到 NSUserDefaults 中?