Fonction dans une méthode d'un nstableview

Bonjour à  tous,

J'ai une application Mac OS dans laquelle j'affiche des données dont l'id et le libellé d'un produit à  partir de la méthode :


func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView?


Dans cette méthode je fais appel à  une fonction qui donne le libellé d'un produit à  partir de son id mais cela ne fonctionne pas, la méthode est bien appelée mais la mise à  jour des données de ne se fait pas.

Auriez vous une idée du problème ?

Réponses

  • Joanna CarterJoanna Carter Membre, Modérateur

    Tu crées la vue et la renvoies ?


  • Désolé j'avais laissé une variable i initialisée à  0 sans l'incrémenter ! ça fonctionne en fait.


    Merci.


  • heliohelio Membre
    septembre 2016 modifié #4

    En revanche ma façon de faire n'est pas optimisée, lorsqu'on scroll la table view c'est saccadé. En effet 


    est-ce qu'il vaut mieux charger toutes les données avant et les stocker dans un NSMutableArray pour les afficher plus tard dans 


    func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? 


    ou autre chose ?


    Merci. 


  • CéroceCéroce Membre, Modérateur
    Je ne sais pas comment est architecturée ton appli, mais voici un cas standard:

    - à  l'affichage de la table, on lance une requête à  un web service
    - un JSON est renvoyé par le web service
    - on compose les objets correspondant au JSON dans la couche Modèle
    - si le Modèle référence des images, on ne les charge que quand la cellule est vraiment affichée. En attendant, on affiche une image "placeholder".
    - on conserve les images dans un cache (de taille limitée)
  • Joanna CarterJoanna Carter Membre, Modérateur
    septembre 2016 modifié #6

    En plus, on fait tous les "travaux" sur le modèle sur un fil arrière-plan, en faisant les mises à  jour UI sur le fil principale.



    let queue = DispatchQueue(label: "com.myapp.travauxavecdonnees")

    queue.async
    {
    directions.calculate
    {
    [unowned self]

    // travaux sur le modèle

    DispatchQueue.main.async
    {
    // mettre à  jour l'UI
    }
    }
    }



  • on ne les charge que quand la cellule est vraiment affichée. 




     


    Avec une notification ?



  • Avec une notification ?




    Avec un block qui ne bloquera pas le mainthread/UI, comme le font SDWebImage/AFNetworking (et sa catégorie UIImage ou UIImageView) ou assimilé.

  • Comment réalises-tu le lien entre l'image qui vient d'être téléchargée et la UICell ou NSCell ?


    Comme ça, je dirais qu'une notif est le plus simple.


  • CéroceCéroce Membre, Modérateur
    septembre 2016 modifié #10

    Comme ça, je dirais qu'une notif est le plus simple.

    Essaie SDWebImage, tu verras que c'est simplissime à  utiliser. Une simple méthode sur UIImageView du genre -setImageAtURL:(NSURL *)imageURL placeholder:(UIImage *)placeholder.
     
    (Et je n'aime pas les notifications: c'est global, donc chiant à  déboguer).

    Comment réalises-tu le lien entre l'image qui vient d'être téléchargée et la UICell ou NSCell ?

    C'est implémenté sous forme de catégorie sur UIImageView. C'est elle qui retient le bloc de completion de la requête réseau. Donc, si l'UIImageView a été évacuée de la mémoire, le bloc n'est pas appelé.
    Comme je le disais, il y a un système de cache des images.
Connectez-vous ou Inscrivez-vous pour répondre.