如何在Swift中重置UICollectionView

时间:2019-01-14 19:34:38

标签: ios swift uicollectionview uicollectionviewcell

我正在使用UICollectionView开发纸牌游戏。在加载单元格时,我重写了UICollectionViewCell的 draw()函数来排列图像。每个新游戏,我都会更改游戏中的纸牌数量。因此,单元的数量和大小会发生变化。由于我使用的是第三部分库,因此我必须在 viewWillAppear()方法中对UICollectionView进行所有操作。我的问题是,如何重置之前通过UICollectionView完成的所有工作。我想在每个游戏期间清除UICollectionView,而不必再次加载UIViewController。想要使用 viewWillAppear()方法进行操作。我想清除UICollectionView,因为如果在新游戏中没有清除UICollectionView,则图像会重叠。

注意:我从UICollectionView中删除了所有子视图,如下所示,但它不起作用

   let subViews = gameCollectionView.subviews

    if subViews != nil {
        for view in subViews {
            view.removeFromSuperview()
        }
    }

2 个答案:

答案 0 :(得分:0)

您需要从每个单元格的contentView中删除每个子视图,而不是从集合视图中删除

gameCollectionView.visibleCells.forEach { $0.contentView.subviews.forEach { $0.removeFromSuperview() } }

但是,我不确定您需要重写draw方法的内容。您应该只创建一次所需的内容,例如在awakeFromNib中,然后仅根据内容更改图像视图的属性,等等,为此,您可以使用集合视图的数据源方法{{ 1}}。

答案 1 :(得分:0)

清除集合是因为​​清除了它的dataSource数组,例如

arr = []
gameCollectionView.reloadData()

如果您需要清除单元格,请在cellForRowAt内进行操作

let cell = ///
cell.contentView.subviews//// clear here

或覆盖

override func prepareForReuse() {
 super.prepareForReuse()
 // clear any subview here
}

如果您为cellForRowAt的每次运行正确地为集合单元的所有属性分配值,而没有添加子视图,那么您将没有重叠