1

我正在使用带有自定义布局的UICollectionView,但在向下滚动并备份后,单元格消失。为什么我的UICollectionViewCells在滚动后消失?

请参阅我的问题的video demonstration

我已经做了一些谷歌搜索和其他人有相关的问题,我认识到这可能是由于细胞再利用,但没有在其他地方找到的答案帮助我。

所以我的问题是:

  1. 这究竟是为什么?

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

有趣的是,当我提出一个UIViewController和关闭它,问题不再出现。请参阅此处的video

注意:这个bug在这里已经有一段时间了(至少从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

1. iOS删除该单元格以节省资源,因为它没有显示,并且您没有正确重新初始化它。 2.正确重新初始化单元格。 (你认为我们是魔术师,真的可以帮助你没有*相关的*代码?) – idmean

+0

感谢您的回复和建议发布一些相关的代码。我要编辑我的问题以包含cellForItem方法的适当部分。请让我知道你是否想要其他东西。 –

+0

什么是inputTextView?它存储在哪里? –

回答

0

想通了。所以代码是导致问题的行竟是viewDidAppear,它是:

inputTextView?.becomeFirstResponder() 

我不知道为什么会引起细胞不出现,但除去该行固定的问题。

0

它可能有一些做与你指定的输入视图给一个变量的事实。通常我只是将输入视图中的文本存储在一个变量中,而不是指向textview本身的变量。你可能会改变这种行为,看看它是否发生了变化,或者只是简单地将你设置输入视图的部分注释到变量中,看看它是否改变了任何东西。

+0

我需要对此文本字段的引用,例如,如果用户按下清除按钮,则可以清除文本字段。 –

+0

所以我尝试了你的建议(注释掉现在设置的变量),并且确实修复了它。所以我认为这有助于隔离问题,但它并不能帮助我实施修复。你有什么建议吗? –

+0

那么你可以将文本存储在变量中,并将textview的文本设置为cellforitem方法中的该变量,然后当它们按下清除时,可以清除集合视图中的变量和reloadData,或者只是在该索引路径上重新加载数据。 – Delimiter