UICollectionView单元格不保留数据---如何使数据保持不变?

时间:2015-01-07 01:07:27

标签: ios swift uicollectionview uicollectionviewcell

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

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

然而,当用户向下滚动然后向上滚动时,所选单元格的数字数据全部搞砸了。

我更深入地研究了问题所在,事实证明单元格没有被缓存,当你用UICollectionView向上滚动时,它会创建新的单元格资产,因为它们内部的数据被破坏(因此我可以' t存储一个数字)。所以我的想法是每当细胞重新出现在屏幕上时都会返回数字,但我无法判断细胞何时被显示。

我制作了一张记录所选单元格的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”事件吗?

1 个答案:

答案 0 :(得分:1)

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

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

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