Label dans une cellule d'une collectionView

Bonsoir à  tous,


J'ai un souci, j'ai ajouté un label dans une cellule d'une collectionView :



func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

num = UILabel(frame: CGRectMake(0, 0, 0, 0))
num.font = UIFont.boldSystemFontOfSize(12.0)
num.backgroundColor = UIColor.whiteColor()
num.textColor = UIColor.blackColor()
num.text = posts.objectAtIndex(indexPath.row).valueForKey("number") as? String
num.sizeToFit()
cell.contentView.addSubview(num)

}

le problème est que du texte semble affiché dessous le label (une précédente valeur d'un label d'une autre cellule certainement).


J'ai tenté de faire ceci :



func prepareForReuse()
{
prepareForReuse()
num.text = ""
}


Cela fonctionne pas.


 


Merci de votre aide.


 


 


Réponses

  • Joanna CarterJoanna Carter Membre, Modérateur
    Tu ne crées ou réutilises pas une cellule ?
  • DrakenDraken Membre
    février 2016 modifié #3

    J'avais eu le même genre de problème. Le prepareForReuse() doit remettre la cellule dans son état initial, alors que tu modifie juste l'affichage du label. A chaque utilisation d'une cellule réutilisable tu ajoutes un nouveau label dans le contentView.


     


    1 utilisation => 1 label dans le contentView


    2 utilisation => 2 labels dans le contentView


    ...


    50 utilisations => 50 labels dans le contentView - ça craint pour la charge mémoire et la vitesse d'affichage.


    100 utilisations => Arg...


     


    Le plus spectaculaire c'est d'utiliser une couleur presque transparente comme backgroundColor du label. A chaque utilisation tu vas voir l'affichage devenir de plus en plus sombre, les couches de couleurs s'empilant les unes sur les autres. C'est le bug que j'ai eu à  ma première tentative d'utilisation d'une UICollectionViewCell. 


     


    Ce qu'il faut faire, c'est effacer le label du contentView dans le prepareForReuse, ou alors utiliser une UICollectionViewCell personnalisée, contenant un label. J'ai testé les deux solutions, la seconde est la meilleure.


     


    Tu peux accéder au contenu du contentView avec la propriété subviews permettant d'accéder au tableau contenant toutes les sous-vues.


     


    Ajoute le code suivant dans la création de la cellule et tu vas vite comprendre à  quelle vitesse les labels s'empilent (inutilement) dans le contentView.



    print (cell.contentView.subviews.count)

  • Joanna CarterJoanna Carter Membre, Modérateur
    Plus facile que ça ; pourquoi ajouter le label chaque fois ? Pouquoi pas créer une cellule avec label dans un fichier XIB et l'utiliser.
  • Merci !


    alors j'ai choisi la solution de l'UICollectionViewCell personnalisée.


    Je ne sais pas encore trop utiliser les XIB.


Connectez-vous ou Inscrivez-vous pour répondre.