UICollectionView 单元格不保留数据 --- 如何使它们的数据持久化?

UICollectionView Cells Are Not Retaining Data --- How Can I Make Their Data Persistent?

我有一个充满自定义单元格对象的 UICollectionView。

当用户选择一个时,我画一个圆圈并在中间放一个数字。

但是,当用户向下滚动然后向上滚动时,所选单元格的数字数据全部混乱。

我深入研究了问题所在,结果发现单元格未被缓存,当您使用 UICollectionView 向上滚动时,它会创建新的单元格资产,因为其中的此类数据已被销毁(因此我无法在其中存储数字)。所以我的想法是每次该单元格重新显示在屏幕上时都将数字放回去,但我无法判断单元格何时显示。

我制作了一张地图,记录了所选单元格的 NSIndexPath。但是,我不知道如何判断当前是否正在显示该路径(即该路径上的单元格)。

你知道我如何判断一个单元格是否在滚动的任何点从 NSIndexPath 显示吗?

这是我选择的单元格代码(我的 UICollectionView 调用它)。

 override public var selected: Bool
    {
        didSet
        {
            _checkMark?.hidden = !selected
            _number?.hidden = !selected
            println("did set")
        }
    }

    func setNumberText(number:UInt8)
    {
        if(_number == nil)
        {
            _number = UILabel(frame: CGRectMake(0,0,1,1))
            addSubview(_number)
        }
        _number.text = String(number)
        _number.sizeToFit()
        _number.frame = CGRectMake(_checkMark.frame.width/2 - _number.frame.width/2, _checkMark.frame.height/2 - _number.frame.height, _checkMark.frame.width, _checkMark.frame.height)
        _numberInt = number
    }

我可以跟踪一些 "cellAtPathIsNowOnScreen" 事件吗?

你做错了。滚动时单元格会被重复使用,发生这种情况的方法是您不知道的实现细节。

相反,您应该将有关单元格应绘制的内容的数据(在本例中为数字)存储在集合视图的数据源中。然后在 - collectionView:cellForItemAtIndexPath: 中,您可以告诉单元格在出队后绘制什么数字,或者如果不应该为该特定单元格绘制数字则清除该值。

此外,UICollectionView 确实有一个 - visibleCells 方法,该方法将 return 当前可见的所有单元格的数组,但这并不是您想要做的。