我遇到一个问题,即UICollectionView中显示的数据会覆盖标签,并且单元格视图不会被清除。
此图显示了问题,
IE:
我的UICollectionViewCell就是这样构建的;
// in viewDidLoad
self.playerHUDCollectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier:reuseIdentifer)
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell:UICollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifer, for: indexPath) as UICollectionViewCell
let arr = UINib(nibName: "EYPlayerHUDView", bundle: nil).instantiate(withOwner: nil, options: nil)
let view = arr[0] as! EYPlayerHUDView
cell.contentView.addSubview(view)
if let allPlayers = self.allPlayers
{
let player:EYPlayer = allPlayers[indexPath.row]
view.updatePlayerHUD(player: player)
}
cell.layoutIfNeeded()
return cell
}
我使用视图在单元格中显示。
我尝试删除cellForItemAt
中所有小区的子节点,但它似乎删除了所有子视图。
我想知道如何清除UICollectionViewCell,因此UICollectionViewCell上的标签和其他信息不像上面的示例那样脏。
非常感谢
答案 0 :(得分:8)
在自定义单元格类中使用prepareForReuse方法,如下所示:
override func prepareForReuse() {
super.prepareForReuse()
//hide or reset anything you want hereafter, for example
label.isHidden = true
}
在您的cellForItemAtIndexPath中,实例化您的自定义单元格:
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "myCellIdentifier", for: indexPath) as! CustomViewCell
然后,始终在cellForItemAtIndexPath中,设置项目可见性/值
答案 1 :(得分:2)
//cell = UICollectionViewCell
for subview in cell.contentView.subviews {
// you can place "if" condition to remove image view, labels, etc.
//it will remove subviews of cell's content view
subview.removeFromSuperview()
}
答案 2 :(得分:1)
UICollectionViewCell
被重用以避免实例化,以优化性能。如果您正在滚动并且单元格变得不可见,则会再次使用相同的对象(dequeueReusableCell
)并在cellForItemAt
中设置新的内容 ...
如前面的答案所述,在重用单元格之前,会在单元格上调用prepareForReuse()
。所以你可以覆盖prepareForReuse()
并做任何你需要做的准备。
但是,您在每次重复使用时都会在单元格中创建并添加新的EYPlayerHUDView
,因此您的单元格会堆满EYPlayerHUDView
个。{/ p>
要避免这种情况,请将UICollectionViewCell
子类设为自定义单元格的EYPlayerHUDView
属性(我建议使用XIB
):
class MyCell: UICollectionViewCell {
@IBOutlet var player:EYPlayerHUDView!
override func prepareForReuse() {
super.prepareForReuse()
// stop your player here
// set your label text = ""
}
}
执行此操作后,您可以更新EYPlayerHUDView
中的cellForItemAt
,而无需对其进行实例化,也无需将其添加为新视图:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifer, for: indexPath) as? MyCell else {
return nil
}
if let allPlayers = self.allPlayers {
let player:EYPlayer = allPlayers[indexPath.row]
cell.player.updatePlayerHUD(player: player)
}
return cell
}
(未经测试的代码)
答案 3 :(得分:0)
制作自定义UICollectionView类并实现prepareForReuse以在需要时清除内容。