我有一个充满自定义单元格对象的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”事件吗?
答案 0 :(得分:1)
你做错了。滚动时单元格会被重用,发生这种情况的方法就是您不了解的实现细节。
相反,您应该存储有关单元格应该在集合视图的数据源中绘制的数据(在本例中为数字)的数据。然后在-
collectionView:cellForItemAtIndexPath:
中,您可以告诉单元格在您将其出列后要绘制的数字,或者如果不为该特定单元格绘制数字,则清除该值。
此外,UICollectionView
确实有一个- visibleCells
方法,该方法将返回当前可见的所有单元格的数组,但这并不是您想要做的。