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