2017-07-10 3 views
0

J'ai une CollectionView qui contient des cellules correspondant aux enfants dans la base de données Firebase. Mon problème est que lorsque je passe à une autre vue, puis se replient, les cellules de CollectionView ont disparu.Comment conserver les cellules CollectionView sur la vue

J'ai une fonction cellForItemAt:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "playerItem", for: indexPath) as! PlayerCollectionViewCell 
    cell.setupViews(parentSize: Int(self.playerCollectionView.frame.width), hostUID: self.currentUID, tempUserName: playerArrayList[indexPath.item]) 
    cell.layer.cornerRadius = 6 
    cell.layer.borderWidth = 2 
    return cell 
} 

J'ai aussi un autre code snippit:

for i in 0..<playerArrayList.count{ 
    print(playerCollectionView.numberOfItems(inSection: 0)) 
    //playerCollectionView.insertItems(at: [IndexPath(item: i, section: 0)]) 
    let cell = playerCollectionView.cellForItem(at: IndexPath(item: i, section: 0)) as! PlayerCollectionViewCell 
    cell.tempUserName = playerArrayList[i] 
    cell.setupViews(parentSize: Int(self.playerCollectionView.frame.width), hostUID: self.currentUID, tempUserName: playerArrayList[i]) 
} 

Je encore à apprendre comment le CollectionView crée des cellules, et ce que le programme fait quand une vue est endormi , mais je crois que mon problème est que la fonction cellForItemAt crée toutes les cellules la première fois que la vue est créée et ne se reproduit plus après. Je suis sûr de cela parce que quand la vue est créée pour la première fois, il y a trois cellules (qui sont exactement combien d'enfants il y a dans la base de données) mais quand on revient à la même vue, il n'y a pas de cellules. J'ai essayé de résoudre ce problème en supprimant toutes les cellules puis en les refaisant. Dans l'extrait de code, vous pouvez voir la ligne a commenté:

playerCollectionView.insertItems(at: [IndexPath(item: i, section: 0)]) 

mais cela me donne l'erreur:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of items in section 0. The number of items contained in an existing section after the update (3) must be equal to the number of items contained in that section before the update (3), plus or minus the number of items inserted or deleted from that section (0 inserted, 1 deleted) and plus or minus the number of items moved into or out of that section (0 moved in, 0 moved out).'

J'ai aussi essayé d'utiliser cette option pour créer des cellules:

let cell = playerCollectionView.dequeueReusableCell(withReuseIdentifier: "playerItem", for: IndexPath(item: i, section: 0)) as! PlayerCollectionViewCell 

Mais j'ai la même erreur. Comment puis-je recréer les cellules lors du retour à la vue?

+0

Comment êtes-vous segueing retour? Êtes-vous sûr de ne pas avancer vers une nouvelle instance de votre contrôleur de vue d'origine? – Paulw11

+0

@ Paulw11 Les deux vues que je suis en train de basculer sont dans la même pile donc je suis à peu près sûr que ce n'est pas une nouvelle instance. https://drive.google.com/file/d/0B5SQeKTVAsVbSEFweEw0dURVejQ/view?usp=sharing Les segments eux-mêmes proviennent du contrôleur de vue pour afficher le contrôleur et non du bouton pour afficher le contrôleur, car je dois effectuer une opération avant de commencer le tronçonnage. – mike

+0

Si vous n'utilisez pas le bouton "retour" dans votre contrôleur de navigation, vous devez vous assurer que vous utilisez une séquence de déroulement, sinon vous continuez à pousser de nouvelles instances de vos contrôleurs de vue.Placez une instruction log ou un point d'arrêt dans 'viewDidLoad' s'il est appelé plus d'une fois, puis créez une nouvelle instance. – Paulw11

Répondre

0

Vérifiez que vous implémentez les méthodes collectionView(_:numberOfItemsInSection:) et collectionView(_:cellForItemAt:) dans votre objet UICollectionViewDataSource.

Lors de l'accès à la cellule avec cellForItem, vous devez vérifier si vous obtenez réellement une cellule. Cette méthode renvoie uniquement les cellules visibles.

if let cell = self.playerCollectionView.cellForItem(at: indexPath) as? PlayerCollectionViewCell { 
    cell.tempUserName = playerArrayList[i] 
    cell.setupViews(parentSize: Int(self.playerCollectionView.frame.width), hostUID: self.currentUID, tempUserName: playerArrayList[i]) 
} 

Au lieu d'insérer des cellules à nouveau, vous devriez avoir un délégué pour une vue de collection qui raconte combien d'articles il y a montrer

override function viewDidLoad() { 
    super.viewDidLoad() 
    playerCollectionView.dataSource = self 
} 

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return playerArrayList.count 
} 

méthode insertItemsAt exige que vous mettez à jour la valeur de retour de numberOfItemsInSection pour correspondre à la nouveau nombre d'articles.

Si playerArrayList objet a besoin de vous rechargeant pouvez faire cette méthode du cycle de vie

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    // reload 
} 
+0

J'ai ajouté l'instruction if pour vérifier si je reçois une cellule, et j'ai ajouté un rechargement à viewWillAppear. J'avais déjà la fonction numberOfItemsInSection, mais je ne l'ai pas mentionnée car je ne croyais pas que c'était le problème. Les bonnes nouvelles sont que je ne reçois aucune erreur, cependant il y a maintenant le double des cellules. Le tableau playerArrayList a seulement 3 éléments, mais il y a 6 cellules dans la vue Collection. Quel pourrait être le problème? @Mika – mike

+0

OK, nous sommes à mi-chemin alors :) Je ne suis pas en mesure de dire à partir du code présenté ici ce qui pourrait être le problème. Peut-être revoir le code dans la méthode cell.setupViews et vérifier qu'il efface toutes les vues ou que l'appel précédent à cette méthode pourrait avoir ajouté. La recherche de réponses pour les cellules d'affichage de collection en double peut également fournir des situations typiques lorsque les cellules sont dupliquées. – Mika

0

vous voulez recharger vue de collection dans la méthode viewWillAppear