Refresh d'une UITableViewCell

TerflogagTerflogag Membre
octobre 2016 modifié dans API UIKit #1

Hello,


 


J'ai quelques soucis pour refresh une UITableviewcell.


 


Dans le cellForRowAt j'applique une configuration spécifique à  ma cellule (application d'un style bold par endroit, border et ajout d'un badge pour certaines images). Le soucis étant que le style n'est appliqué qu'après un scroll... 


 


J'ai pensé à  un problème de réutilisation de cellule, ou à  un refresh avec cell.layoutIfNeeded(), mais sans succès.


 


Voici un bout de code de mon : 



let cell = tableView.dequeueReusableCell(withIdentifier: "meCell", for: indexPath) as! MyCellClass
if let notification = self.currentRecommendations()?[(indexPath as NSIndexPath).row] as? GFNotificationResult {
cell.configure(withNotification: notification)
}
cell.layoutIfNeeded()
return cell

Si quelqu'un à  déjà  eu le soucis je suis preneur ! 


 


Bonne journée 


Réponses

  • Joanna CarterJoanna Carter Membre, Modérateur

    Qu'est-ce tu as comme code dans la cellule ?


  • TerflogagTerflogag Membre
    octobre 2016 modifié #3

        func configure(withNotification notification: NotificationResult) {


            // Notification's content


            if (notification.type == NotificationResult.notificationsType.favBy.rawValue)


            || (notification.type == NotificationResult.notificationsType.favTo.rawValue) {


                // Add fav icon at the end of label


                if let message = notification.message {


                    if message.contains("<b>") {


                        var msg = message


                        self.messageLabel?.attributedText = msg.attributedStringWithBold()


                    } else {


                        self.messageLabel?.attributedText = message.addFavIcon()


                    }


                } else {


                    self.messageLabel?.text = ""


                }


            } else {


                self.messageLabel?.text = notification.message ?? ""


            }


            


            // isCertified ?


            if notification.isVerified == true {


                self.avatarImageView?.setCertifiedStyle()


            } else {


                self.avatarImageView?.setUncertifiedStyle()


            }


            


            // Set image url


            if let imageUrl = notification.fromAvatar, let url = URL(string: imageUrl) {


                self.avatarImageView?.imageUrl = url


            }


            


            // Since...


            if let time = notification.time {


                self.timeLabel?.text"Il y a \(time)"


            }


            


            self.setNeedsLayout()


     


        }


     



     


    msg.attributedStringWithBold() -> Renvoie un attributedString avec la conversion en bold pour les champs spécifié, c'est ce bold qui n'est affiché qu'après scroll...


    self.avatarImageView?.setCertifiedStyle() -> Applique un border style différent + un logo certifié sur l'image via un addsubview. C'est ce logo qui n'est affiché qu'après scroll...


  • Joanna CarterJoanna Carter Membre, Modérateur

    Et tu reçois la notification où ?


     


    Ton code dans tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) ne sera appelé que si tu appelles tableView.reloadData.


     


    Il vaut mieux de recevoir la notification dans la cellule.



    // ailleurs

    let myNotification = Notification.Name("myNotification")



    class MyCellClass : UITableViewCell
    {
    required init?(coder aDecoder: NSCoder)
    {
    super.init(coder: aDecoder)

    NotificationCenter.default.addObserver(self, selector: #selector(handleNotification(notification:)), name: myNotification, object: nil)
    }

    func handleNotification(notification: Notification)
    {
    // mettre à  jour le cellule
    }
    }
  • TerflogagTerflogag Membre
    octobre 2016 modifié #5

    Les notifications sont reçues d'un web service, une fois le parse effectué, je set un tableau de notification, qui possède : 



            didSet {
                self.reloadTableView()
            }

    Avec reloadTableView() qui effectue un reloadData sur la MainQueue 


     


    Impossible donc de recevoir la notification directement dans la cellule :/


     


    La configuration se faisant dans le cellForRowAt  en synchrone je ne comprend pas pourquoi cela n'apparait pas...


  • Joanna CarterJoanna Carter Membre, Modérateur

    Les notifications, elles sont pour tous les cellules en même temps, ou pour une cellule seulement ?




  • Les notifications, elles sont pour tous les cellules en même temps, ou pour une cellule seulement ?




     


    Toutes les cellules en même temps. 


    Un refresh -> je récupère et parse/reload toutes les notifications !


     


    Merci pour ton aide :) 

  • Joanna CarterJoanna Carter Membre, Modérateur

    OK. Et tu as mis un breakpoint dans le code pour vérifier s'il execute ou non ?




  • OK. Et tu as mis un breakpoint dans le code pour vérifier s'il execute ou non ?




     


    Oui le code est bien exécuté...


     


    Je vais essayer en mettant un flag dans ma cellule et en exécutant le code dans le layoutSubviews() peut être ?

  • J'ai résolu le problème pour le bold.


     


    J'appliquais au démarrage un style globale a mes label : 



    UILabel.appearance().tintColor = self.whiteColor
    UILabel.appearance().font = UIFont.mainRegularFont(mainFontSize)

    Une fois ces deux lignes en commentaires le bold s'est affiché sans avoir besoin de scroll...


     


    Reste le soucis du badge rajouté aux UIImageView qui ne s'affiche qu'après scroll ! 


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