如何在重新加载时清除UICollectionViewCell?

时间:2017-04-04 08:07:26

标签: ios swift uicollectionviewcell reload

我遇到一个问题,即UICollectionView中显示的数据会覆盖标签,并且单元格视图不会被清除。

此图显示了问题,

IE:

UICollectionViewCell data is not getting cleared

我的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上的标签和其他信息不像上面的示例那样脏。

非常感谢

4 个答案:

答案 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以在需要时清除内容。