【问题标题】:Why Do My UICollectionViewCells Disappear After Scroll?为什么滚动后我的 UICollectionViewCells 消失了?
【发布时间】:2017-06-19 18:48:27
【问题描述】:

我正在使用带有自定义布局的 UICollectionView,但我遇到了向下滚动和备份后单元格消失的问题。

请查看我的问题的video demonstration

我在谷歌上搜索了一些,其他人也遇到了相关问题,我认识到这可能是由于细胞重复使用造成的,但我在其他地方找到的答案都没有帮助我。

所以我的问题是:

  1. 为什么会这样?

  2. 如何阻止这种情况发生?

有趣的是,一旦我提出 UIViewController 并关闭它,问题就不再出现了。请查看video 的实际操作。

注意:这个错误已经存在了一段时间(至少从 iOS 10 开始,并且在 iOS 11 beta 1 中也没有修复)。

编辑 1

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    switch (indexPath as NSIndexPath).row {
    case 0:
        // Speak Logo Cell
        let speakLogoCell = collectionView.dequeueReusableCell(withReuseIdentifier: "SpeakLogoCell", for: indexPath) as! SpeakLogoCell

        recordButton = speakLogoCell.recordButton

        return speakLogoCell
    case 1:
        // Text Input Cell
        let inputCell = collectionView.dequeueReusableCell(withReuseIdentifier: "InputCell", for: indexPath) as! InputCell

        inputCell.inputTextView.delegate = self
        inputTextView = inputCell.inputTextView

        // Only restore input if launching and required.
        if currentlyLaunching && UserDefaultsHelper.loadShouldRestoreInput() {
            inputTextView!.text = UserDefaultsHelper.loadInput() ?? ""
        }

        return inputCell
    case 2:... // Continues for all the other cells

【问题讨论】:

  • 1. iOS 删除了单元格以节省资源,因为它没有显示并且您没有正确地重新初始化它。 2. 正确重新初始化单元。 (你认为我们是魔术师,真的可以在没有任何相关代码的情况下帮助你吗?)
  • 感谢您的回复和建议发布一些相关代码。我将编辑我的问题以包含 cellForItem 方法的适当部分。如果您还有其他需要,请告诉我。
  • 什么是inputTextView?它存储在哪里?
  • inputTextView 是对存储在UIViewController 中的UITextView 的引用,其中包含UICollectionView

标签: ios swift uicollectionview uicollectionviewcell uicollectionviewlayout


【解决方案1】:

想通了。所以导致问题的代码行实际上是在viewDidAppear 中,它是:

inputTextView?.becomeFirstResponder()

我不知道为什么它会导致单元格不出现,但删除该行解决了问题。

【讨论】:

    【解决方案2】:

    这可能与您将输入视图分配给变量的事实有关。通常我只会将输入视图中的文本存储在一个变量中,而不是让一个变量指向文本视图本身。您可能会更改该行为并查看它是否更改,或者只是简单地注释掉您现在将输入视图设置为变量的部分并查看它是否有任何更改。

    【讨论】:

    • 我需要对该文本字段的引用,例如,如果用户按下清除按钮,我可以清除该文本字段。
    • 所以我已经尝试了你的建议(现在注释掉设置变量)并且确实解决了它。所以我想这有助于隔离问题,但它并不能真正帮助我实施修复。你有什么建议吗?
    • 好吧,您可以将文本存储在一个变量中,并在 cellforitem 方法中将 textview 的文本设置为该变量,然后当他们按下清除时,您可以清除该变量并在集合视图上重新加载数据,或者只是重新加载该索引路径的数据。
    • 好的,然后大概我会在每次文本视图的文本更改时使用适当的委托方法更新文本变量。我试试看,谢谢
    • 好吧,据我所知,实际上并没有任何重复的细胞类型。为什么不直接使用 UIScrollView?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多