【问题标题】:How to reset UICollectionView in Swift如何在 Swift 中重置 UICollectionView
【发布时间】:2019-06-08 19:49:06
【问题描述】:

我正在使用 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()
        }
    }

【问题讨论】:

  • 是否可以为加载数据的 UICollectionView 创建一个类,然后删除 UICollectionView 并将其重新加载到 UIView 以重新加载它。我不知道 reloadData 始终是我使用的方法,但你说你不能使用它
  • 我不明白您的收藏视图如何工作或应该如何工作。你到底想清楚什么?什么是第三方库?你在 viewWillAppear 中做了哪些操作?我认为目前没有足够的信息可以帮助您。
  • 不要覆盖UICollectionViewdraw方法。为什么要删除集合视图的子视图?你所做的一切听起来都不对。
  • 您将图像添加到哪个视图?
  • 我将图像添加到 UICollectionViewCell 的 contentView @RobertDresler 的 draw 方法中

标签: ios swift uicollectionview uicollectionviewcell


【解决方案1】:

清除集合是从清除它的 dataSource 数组之类的

arr = []
gameCollectionView.reloadData()

如果您需要清除单元格,请在 cellForRowAt 中执行此操作

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

或覆盖

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 你在哪里添加这些图片?到哪个视图
    • 您不应该删除集合视图单元格的所有子视图。
    • @nihasmata 好的,用contentView检查编辑的答案
    • @RobertDresler 谢谢,它删除了子视图,但现在的问题是旧单元格没有调用 CollectionViewCell draw() 方法。它重用了旧单元格。认为我为第一个游戏指定了 20 张卡片(CollectionViewCel),因此调用了 20 次 draw() 方法并将我的图像添加到 CollectionViewCell 的内容视图中。然后下一场比赛我指定了 30 张牌,但这次 draw() 方法调用了 10 次(30-20)。我想重置有关 CollectionView 的所有内容。我想在第二场比赛中调用 draw() 方法 30 次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    相关资源
    最近更新 更多