1

J'utilise un UICollectionView avec une disposition personnalisée, mais j'ai des problèmes avec les cellules qui disparaissent après que je défile vers le bas et sauvegarder.Pourquoi mes UICollectionViewCells disparaissent-elles après le défilement?

Veuillez voir un video demonstration de mon édition. J'ai fait du googling et d'autres personnes ont des problèmes liés et je reconnais que c'est peut-être dû à la réutilisation des cellules, mais aucune des réponses que j'ai trouvées ailleurs ne m'a aidé.

Mes questions sont les suivantes:

  1. Pourquoi est-ce qui se passe?

  2. Comment puis-je empêcher cela de se produire?

Fait intéressant, une fois que je présente une UIViewController et écartons, la question ne se produit plus. S'il vous plaît voir le video de cela en action.

REMARQUE: Ce bogue est présent depuis un certain temps (au moins depuis iOS 10 et n'a pas été corrigé dans iOS 11 bêta 1 non plus).

Modifier 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 a supprimé la cellule afin d'économiser des ressources car elle n'était pas affichée et vous ne l'avez pas réinitialisée correctement. 2. Réinitialiser correctement la cellule. (Pensez-vous que nous sommes des magiciens et pouvons vraiment vous aider sans aucun * code * pertinent?) – idmean

+0

Merci pour votre réponse et suggestion de poster du code pertinent. Je vais modifier ma question pour inclure la partie appropriée de la méthode cellForItem. S'il vous plaît laissez-moi savoir si vous voulez autre chose. –

+0

Qu'est-ce que inputTextView? Où est-il stocké? –

Répondre

0

Compris. Ainsi, la ligne de code qui a été l'origine du problème était en fait dans viewDidAppear et il était:

inputTextView?.becomeFirstResponder() 

Je ne sais pas pourquoi il a causé la cellule ne pas apparaître, mais la suppression de cette ligne fixe la question.

0

Il pourrait avoir quelque chose à voir avec le fait que vous affectez la vue d'entrée à une variable. En général, je voudrais juste stocker le texte de la vue d'entrée dans une variable plutôt que d'avoir une variable pointant vers la vue elle-même. Vous pouvez changer ce comportement et voir s'il change, ou tout simplement commenter la partie où vous définissez la vue d'entrée dans une variable pour le moment et voir si elle change quelque chose.

+0

J'ai besoin d'une référence à ce champ de texte afin que je puisse, par exemple, effacer le champ de texte si l'utilisateur appuie sur le bouton d'effacement. –

+0

J'ai donc essayé ce que vous aviez suggéré (en commentant la définition de la variable pour l'instant) et cela a résolu le problème. Donc, je suppose que cela a aidé à isoler le problème, mais cela ne m'aide pas vraiment à mettre en place un correctif. Avez-vous des suggestions? –

+0

Eh bien, vous pouvez stocker le texte dans une variable et définir le texte de textview à cette variable dans la méthode cellforitem, puis quand ils cliquent sur clear vous pouvez effacer la variable et reloadData sur la vue de collection, ou simplement recharger les données à ce chemin d'index . – Delimiter