Boucle d'images si NULL

easydeasyd Membre
février 2017 modifié dans API UIKit #1

Bonjour tout le monde,


J'ai découvert un problème sur mon application, que j'essaie de résoudre.

J'ai des images que se répète dans un UITableViewCell, ça me fait des choses bazar.

J'attribue un chiffre, et une image qui correspond à  ce chiffre.


Mais cela ne se rafraichit pas quand cela est NULL dans mon UITableViewCell.



if !(person["logo"] is NSNull){
Alamofire.request(person["logo"] as! String)
.responseImage { response in

if let image = response.result.value {
self.images.image = image
}
}
}

Mon JSON est correct, j'ai regardé de partout, je n'ai rien trouver d'anormal, c'est bien NULL dans ma requête. 


 


Merci a vous,


 


 


 


 


 


 


Réponses

  • DrakenDraken Membre
    février 2017 modifié #2

    Je dirais que c'est normal. Les cellules sont recyclées en permanence par la table. C'est-à -dire qu'une "nouvelle" cellule est en fait une ancienne avec son contenu précédent. S'il y avait une image dans son champ .image elle est encore là .


     


    Pour éviter ça, tu dois remettre la cellule à  l'état vide avant de l'utiliser. Par exemple :


    a



    ...
    self.images.image = nil
    if let image = response.result.value {
    self.images.image = image
    }
    ...


    a


    EDIT : Mon exemple n'est peut-être pas assez précis. La cellule doit être remise à  un état vierge juste après sa "création" (qui n'est pas une vraie création mais un recyclage).


    a



    // Création (recyclage) de la cellule
    ...
    // Remise à  l'état vierge
    self.image.image = nil
    self.tesAutresChampsPersonalisés = ...

    // Ton traitement
    if !(person["logo"] is NSNull){
    Alamofire.request(person["logo"] as! String)
    .responseImage { response in

    if let image = response.result.value {
    self.images.image = image
    }
    }
    }




    a

  • Joanna CarterJoanna Carter Membre, Modérateur

    Tout d'abord, améliores ton code pour être sûr que tu aies un bon "logo"



    if let logo = person["logo"] as? String
    {
    Alamofire.request(logo).responseImage
    {
    response in

    if let image = response.result.value
    {
    self.images.image = image
    }
    }
    }
  • Joanna CarterJoanna Carter Membre, Modérateur


     


    Je dirais que c'est normal. Les cellules sont recyclées en permanence par la table. C'est-à -dire qu'une "nouvelle" cellule est en fait une ancienne avec son contenu précédent. S'il y avait une image dans son champ .image elle est encore là .


     


    Pour éviter ça, tu dois remettre la cellule à  l'état vide avant de l'utiliser. Par exemple :



    ...
    self.images.image = nil
    if let image = response.result.value {
    self.images.image = image
    }
    ...



     


    Et, pour ça, il faut override prepareForReuse() sur la cellule.



    override func prepareForReuse()
    {
    super.prepareForReuse()

    self.images.image = nil
    }


  •  


    Et, pour ça, il faut override prepareForReuse() sur la cellule.



    override func prepareForReuse()
    {
    super.prepareForReuse()

    self.images.image = nil
    }



    Oui, je sais. J'allais lui en parler ensuite. Tu m'as évité un post.

  • Quelle est la différence entre l'override de prepareForReuse() et le fait de remettre à  nil dans une boucle ?


     


    J'me doute que c'est plus propre dans prepareForReuse() mais est-ce la seule différence ?


  • Joanna CarterJoanna Carter Membre, Modérateur


    Quelle est la différence entre l'override de prepareForReuse() et le fait de remettre à  nil dans une boucle ?


     


    J'me doute que c'est plus propre dans prepareForReuse() mais est-ce la seule différence ?




     


    Oui, c'est plus propre, ça n'arrive qu'une seule fois après la cellule a été recyclée et ça évite de confondre le code de préparation de la cellule

  • DrakenDraken Membre
    février 2017 modifié #8


    Quelle est la différence entre l'override de prepareForReuse() et le fait de remettre à  nil dans une boucle ?


     


    J'me doute que c'est plus propre dans prepareForReuse() mais est-ce la seule différence ?




    a


    Le code d'easyd n'utilise qu'une cellule standard, avec une seule image. Mais imagine une cellule personnalisée, avec plusieurs labels et images. C'est pratique d'avoir une seule fonction pour traiter toutes les opérations de remise à  zéro. Cela facilite la maintenance du code si la structure de la cellule évolue.


    a



    override func prepareForReuse()
    {
    super.prepareForReuse()

    self.images.image = nil
    self.images.truc = nil
    self.label1 = ""
    self.label2 = ""
    ...
    }



  • Merci pour vos aide,


     


    ça fonctionne très bien.


     


    Merci a vous,


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