2017-05-30 36 views
-1

我遇到了自定义UICollectionViewCell问题,我可以在重新加载集合视图时快速查看前一个单元格中的数据。但是,电池最终会以正确的数据结束。当设置值时,UICollectionViewCell快速显示前一个单元格中的数据

我的自定义单元格有一个UIButton,我正在设置func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {}委托方法的标题。

我已经尝试过,例如:cell.myButton.setTitle("", for: .normal)在设置我希望使用的实际标题之前“清除”之前在集合视图中为每个项目设置的值。

任何想法可能导致这种情况?

感谢您的帮助提前!

+0

将前一个单元格的数据设置为nil,如果它们在显示新数据之前有图像或其他东西。 –

+0

您是否使用'dispatch_async()'调用来设置值? 'collectionView:cellForItemAtIndexPath:'应该在主队列上运行,所以使用GCD是没有意义的,并且会在调度和实际执行特定任务之间造成“滞后”。那个委托方法的实际实现是什么? –

+0

感谢您的回复,伙计们。我已将我的按钮类型更改为“自定义”,正在解决此问题。不完全确定为什么,如果你有任何我想知道的想法,谢谢! – Dayna

回答

0

当您没有正确设置数据时,通常会发生此问题。如下例所示,使用字母数组来填充集合视图数据。在cellForItemAt方法中,我们只在字母等于A时设置按钮标题。这会导致闪烁的问题,因为当单元格不等于“A”时我们没有处理这种情况。为了解决这个问题,我们需要处理的条件时,它不等于A.

let alphabets = ["A", "C", "A", "D", "E"] 

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellIdentifier", for: indexPath) 
    let alphabet = alphabets[index.row] 
    if alphabet == "A" { 
     cell.myButton.setTitle("Success", for: .normal) 
    } 

    // To fix it, handle the case when alphabet is not equal to "A" 
    else { 
     cell.myButton.setTitle("", for: .normal) 
    } 

    return cell 
} 
+0

嗨,感谢您的回复,非常感谢。我刚刚发现,如果我设置按钮键入“自定义”,我不再有这个问题。很奇怪,我不知道为什么这个修复它。 – Dayna

+0

欢迎。是的很奇怪。 – muazhud

+0

我建议你总是使用你的按钮的自定义值,因为系统按钮有一些默认样式,根据文档:“系统样式按钮,如导航栏和工具栏中显示的那些按钮。” – Beninho85

0

虽然你已经想通了周围的按钮类型设置为custom的工作(我不知道如何解决它您的问题虽然),只是想让你知道cellForRowAtIndexPath不是清理已经加载的单元格的好地方。

如果你有你的自定义单元格,那么你应该考虑重写prepareForReuse()并清除单元格,然后重用它。

override func prepareForReuse() { 
    //clear your cell here 
} 
相关问题