iOS 8 Swift UICollectionView reloadData() 导致视图(图像)跳转单元格

Posted

技术标签:

【中文标题】iOS 8 Swift UICollectionView reloadData() 导致视图(图像)跳转单元格【英文标题】:iOS 8 Swift UICollectionView reloadData() causing views (images) to jump cells 【发布时间】:2015-04-03 08:33:21 【问题描述】:

我有 20 个单元格的 UICollectionView,其中有一个 imageView。当用户单击正确的单元格时,我会在该单元格中绘制另一个 imageView(我们称之为正确的圆圈)。这工作正常。

但我在UICollectionView 中也有一个标题,我在其中询问他们需要回答的问题。每次单击(等待 2 秒)后,问题应该被更新,我有一个更新标题文本标签的功能,这也可以正常工作。

我的问题是: 为了更新标题文本,我必须调用uicollectionView.reloadData(),每当我这样做时,我在单元格(正确圆圈)中绘制的UIImageView 都会移动到另一个单元格!

我已经尝试了所有我能想到的方法,包括这个帖子中的解决方案: UICollectionView reloadData not functioning properly in ios 7

但不能让它工作。任何想法都非常受欢迎。理想情况下,我只会刷新标题而不是其余单元格,但似乎没有办法做到这一点。

编辑:基于 cmets 稍微修改代码,现在我在每个单元格中有 2 个图像,其中一个被隐藏,然后显示它,而不是在单击时添加 imageView

以下是一些相关代码:

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as CollectionViewIconCell    

        // bigIcon() just returns the animal's icon image
        cell.icon.image = animalsArray[indexPath.row].bigIcon()

        return cell
    

override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) 
        // we cannot use a dequeueReusableCellWithReuseIdentifier, we need this
        let cell = collectionView.cellForItemAtIndexPath(indexPath) as CollectionViewIconCell

        if currentAnimal == self.correctAnimal 
            cell.circleImage.image = correctCircleImage
            cell.circleImage.hidden = false

            correctAnswers++

            // nextQuestion() simply loads the text that will go in the Header.label
            self.nextQuestion()
            self.collectionView!.reloadData()

         else 
            self.answerCircle.image = UIImage(named: "wrongCircle")
            self.answerCircle.sizeToFit()
            cell.addSubview(answerCircle)

            self.nextQuestion()
            self.collectionView!.reloadData()
                
    

谢谢。

附言

阅读了一些 cmets,也许我没有在新问题上正确设置标题的文本?我从教程中获得了所有这些代码,对 UICollectionView 来说非常新,所以请原谅我的无知,但是有没有更好的方法来刷新标题文本?我无法在 viewForSupplementaryElementOfKind 函数之外获取标题。

我应该解释一下,我有 2 个不同的 imageViews,一个用于正确答案,一个用于错误答案,因为正确答案的圆圈应该保留,而错误答案的圆圈将在每个问题上被删除并重复使用。

【问题讨论】:

请显示创建单元格的代码 【参考方案1】:

您的问题不在显示的代码中,而是在请求时返回单元格的代码中,特别是因为您没有通过设置两个图像视图的状态来完全更新它。因此,当单元格被重复使用时,它的另一行设置错误(旧)。

真的是数据模型和单元设计问题。单元格应始终具有 2 个图像视图,您应该根据需要使其可见或隐藏,并且应根据您在每次用户选择后更新然后重新加载的数据模型来确定所需的(仅在可以时更新单元格,而不是完全重新加载)。

【讨论】:

但重新加载的问题是要更改标题文本,而不是要显示圆形图像,当前显示没有重新加载。我会测试你的建议,但这并不妨碍我为了刷新标题而必须重新加载。 重新加载是问题的触发因素,因为它会更新所有单元格。大概你重新加载是因为标题可能会随着每个问题而改变大小?即使您真的不需要重新加载标题,您也应该真正修复数据模型以保持选择状态。 当然,我会解决单元格问题,但是,正如我所说,我需要重新加载,否则问题中的文本根本不会改变,不仅是大小,还有文本本身。也许我在标题中设置了错误的文本?我也会展示这段代码。 如果您获得标题视图并更新它应该更改的内容,您必须显示代码但它是一个单独的东西 我相信你的最后一个建议解决了这个问题。如果您愿意编辑您的答案以反映我会接受它。我的意思是它本来就很好,但是更具体地说,我的事情可以帮助更多的人,事实上我应该在加载每个单元格时检查图像的状态是关键。谢谢!

以上是关于iOS 8 Swift UICollectionView reloadData() 导致视图(图像)跳转单元格的主要内容,如果未能解决你的问题,请参考以下文章

Swift - Xcode 8 - iOS 10 - 无法创建简单约束

iOS 8.0 Swift 中的 OneSignal 集成

Swift 4 - 如果已选择,请取消选择集合视图单元格

在 Swift 中以编程方式在 UITableViewCell 中创建一个 UICollectionView

iOS 8 swift 无法播放音频文件

iOS 8 中的自定义振动 - Swift