0

Désolé pour le titre vague mais je n'étais pas complètement sûr de l'appeler. J'ai une liste de cellules de vue de collection dans une collection. Ces cellules ont juste un fond blanc. J'ai un total de 20 cellules et je veux que le premier ait un fond cyan et le quatrième un fond vert. Mon problème est que si la liste est assez grande et je fais défiler les couleurs semblent être aléatoire parfois 4 vert et 2 cyan au sommet au lieu de seulement 1 cyan et 1 vert. Je pense que cela est dû à l'utilisation de l'index path.row dans la méthode func collectionView (_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> méthode UICollectionViewCell et l'attribution de couleurs basées sur indexpath.row. Je pense que l'index path.row change au fur et à mesure que je défile, alors quand je défile vers le bas de l'index path.row, c'est l'élément en haut de l'écran et non en haut de la liste. Je comprends que ce n'est pas la bonne façon d'y parvenir, y at-il de toute façon pour obtenir le premier/dernier élément de la liste au lieu du premier/dernier actuellement sur mon écran? Y a-t-il une meilleure façon de s'y prendre entièrement?Swift CollectionViewCells Numéro

Voici un exemple rapide de ce que la question ressemble - https://gyazo.com/e66d450e9ac50b1c9acd521c959dd067

EDIT:

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int` is return 20 and in `func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell` this is what I have - `let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Invite Cell", for: indexPath) as! InviteCell 
    print(indexPath.row) 

    if indexPath.row == 0 { 
     cell.InviteCellContainer.backgroundColor = UIColor.cyan 
    } else if indexPath.row == 5 { 
     cell.InviteCellContainer.backgroundColor = UIColor.green 
    } 
    return cell 
} 

Répondre

2

Les cellules sont réutilisées. Assurez-vous que tout élément d'interface utilisateur a un état défini dans cellForItemAt:

Dans votre code l'état est indéfini si la ligne est différent de 0 et non 5. Vous avez donc besoin d'ajouter un cas pour tous les autres indices:

if indexPath.row == 0 { 
    cell.InviteCellContainer.backgroundColor = UIColor.cyan 
} else if indexPath.row == 5 { 
    cell.InviteCellContainer.backgroundColor = UIColor.green 
} else { 
    cell.InviteCellContainer.backgroundColor = UIColor.gray // or what the default color is 
} 
return cell 

une syntaxe plus descriptive est une expression switch

switch indexPath.row { 
    case 0: cell.InviteCellContainer.backgroundColor = UIColor.cyan 
    case 4: cell.InviteCellContainer.backgroundColor = UIColor.green 
    default: cell.InviteCellContainer.backgroundColor = UIColor.gray 
} 
+0

Merci cela a corrigé !!!! – XvKnightvX

0

En supposant que votre code n'est pas défectueux, que je ne peux pas dire parce que vous n'avez pas inclus Tout cela, il semble que vous devriez appeler collectionView.reloadData() après chaque cellForItemAt. Dites-moi ce qui se passe quand vous faites cela.

+0

J'ai ajouté le code des deux fonctions de vue de collection sur la question – XvKnightvX

0

Vous devez définir la couleur de fond quelle que soit sa place

if(indexPath.row == 0) { 
    cell.InviteCellContainer.backgroundColor = UIColor.cyan 
} else if(indexPath.row == 5) { 
    cell.InviteCellContainer.backgroundColor = UIColor.green 
} else { 
    cell.InviteCellContainer.backgroundColor = UIColor.white 
} 
return cell 

Il se peut que ce soit parce que vous n'avez pas défini la cellule dans une classe distincte et que vous avez utilisé la fonction prepareForReuse() pour remettre l'arrière-plan au blanc. Les cellules sont réutilisées dans une collection, donc parfois si vous définissez les données (et ne les réinitialisez pas), elles resteront les mêmes lorsque la cellule sera à nouveau utilisée. J'espère que cela aide!