Image dans une table cell (en mode view)

Bonjour,


 


j'ai dans une application Cocoa (pas iOS), un panel dans lequel j'ai une table view, pas en mode "cell", mais "View". Pour cette vue où je n'ai pas utilisé de bindings, mais une data source et delegate.


Quand je configure mes vues dans la méthode


 


- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row


 

les images ne sont pas toujours dispo, et je les gère au niveau du contrôleur avec un cache et je les cherches en cas de besoin 

 


        NSImage *listingImage = <span style="color:#bb2ca2;">self</span> <span style="color:#31595d;">listingImagesCache</span>] <span style="color:#3d1d81;">objectForKey</span>:[listing <span style="color:#31595d;">mlsKey</span>;


        if (listingImage) {


            [[aCellView listingImageView] setImage:listingImage];


        } else {


            [self fetchImageForListing:listing withRowIndex:row];


        }


 


 

avec une méthode asynchrone:

 


- (void)fetchImageForListing:(DGListingAnnotation *)aListing withRowIndex:(NSInteger)rowIndex


{


    NSURL *imageURL = [self firstImageURLWithAnnotation:aListing];


    NSMutableURLRequest *imageRequest = [NSMutableURLRequest requestWithURL:imageURL];


    [imageRequest setHTTPShouldHandleCookies:NO];


    [imageRequest addValue:@image/* forHTTPHeaderField:@Accept];


    [NSURLConnection sendAsynchronousRequest:imageRequest


                                       queue:[NSOperationQueue mainQueue]


                           completionHandler:^(NSURLResponse* response, NSData* listingData, NSError* error)


     {


         if (!error && [(NSHTTPURLResponse*)response statusCode] == 200 ) {


             NSImage *listingImage = [[NSImage alloc] initWithData:listingData];


             <span style="color:#bb2ca2;">self</span> <span style="color:#31595d;">listingImagesCache</span>] <span style="color:#3d1d81;">setObject</span>:listingImage <span style="color:#3d1d81;">forKey</span>:[aListing <span style="color:#31595d;">mlsKey</span>;


             [[self listingTableView] reloadData];


         } else {


 


         }


     }];


 


}


 


 

Le problème c'est que je ne sais pas au moment où l'image arrive trouver la vue où elle devrait se placer, du coup j'appelle un "reloadData" sur la table, cela fonctionne, mais cela m'attriste un peu car le fait de recharger la table pour chaque image retrouvée ne me semble pas la méthode la plus optimale.

 

Je suis peut-être passé à  côté de quelque chose ou peut-être vaut-il mieux basculer en mode cellule plutôt que vue? Au départ j'ai lu que le mode view c'était mieux mais ca n'a pas l'air vraiment optimal...

 

Vous avez quoi comme expérience/opinion sur le sujet ?

 

Denis 

 

 

 

 


Mots clés:

Réponses

  • CéroceCéroce Membre, Modérateur
    View ou Cell, c'est la même problématique: une fois l'image chargée, il faut pouvoir l'attribuer à  la cellule.

    Sous iOS, ce qu'on voit habituellement, c'est qu'on ajoute une catégorie sur UIImageView, avec une méthode du type:
    -(void) setImageAtURL:(NSURL *)url placeholder:(UIImage *)placeholder;
    Ainsi, l'image view prend le placeholder en attendant, et quand l'image est chargée, elle est associée à  l'imageView; on ne se pose donc pas de question de savoir quelle cellule est concernée.

    Par contre, il y a un truc à  gérer: le temps que l'image soit chargée, la cellule et donc l'image view ont pu disparaà®tre de l'écran et de la mémoire. Si tu as conservé un pointeur sur l'image view, tu peux créer un beau plantage.
  • sous iOS, on trouve des méthodes assez pratiques, permettant par exemple de trouver les cellules visibles, ce qui permet de retrouver assez facilement les cellules en cours d'affichage pour leur attribuer les images une fois chargée, mais sour OSX retrouver les cellules "visibles" cela me parait moins évident. Je connais la catégorie dont tu parles elle vient avec AFNetworking, c'est une catégorie de UIImageView (iOS). Par ailleurs j'aime bien l'idée de mettre les images en cache au niveau du contrôleur, mais si je peux éviter de remettre à  jour toute les cellules instanciée ce serait peut-être mieux (même si pas vital puisque cela fonctionne tel quel...)

  • Il y a la méthode:


    - (NSRect) rectOfRow:(NSInteger)rowIndex


     


    il suffit de faire ensuite un setNeedsDisplayInRect:


  • trop fort! 


    Merci beaucoup 


     


     




    Il y a la méthode:


    - (NSRect) rectOfRow:(NSInteger)rowIndex


     


    il suffit de faire ensuite un setNeedsDisplayInRect:



  • c'était bien la méthode que je cherchais à  avoir, mais après l'avoir testé je suis revenu au reload data, car les vues offlines n'étaient pas mises à  jour. Comme j'utiliser ma table en mode view, ce qui permet de composer graphiquement l'interface de la cellule (comme sous iOS), le comportement est assez différent du mode cell, notamment du fait que les vues ne sont pas recyclées comme le sont les cellules. En pratique j'ai beaucoup plus de "view cell" que de cell visible et elle sont désalouée dès que l'on scroll au delà  d'un certaine limite.


    Les resources d'un mac étant bien plus larges que celles d'un téléphone, ce n'est pas dramatique, mais cela impose une logique différente et il faut se l'approprier. Du coup je vais regarder un peu du côté des "Collection View" pour voir si ce ne serait pas une meilleur option... (permettant d'avoir à  la fois plus de possibilités mais aussi un code plus uniforme entre MacOS et iOS).

  • CéroceCéroce Membre, Modérateur

    Du coup je vais regarder un peu du côté des "Collection View" pour voir si ce ne serait pas une meilleur option... (permettant d'avoir à  la fois plus de possibilités mais aussi un code plus uniforme entre MacOS et iOS).

    Les collections views ne fonctionnent pas du tout de la même façon sous OS X, et tu vas voir qu'il s'agit d'une des pires classes d'App Kit. Cherche comment sélectionner une vue d'une collection view, tu constateras que c'est du délire.


  • Les collections views ne fonctionnent pas du tout de la même façon sous OS X, et tu vas voir qu'il s'agit d'une des pires classes d'App Kit. Cherche comment sélectionner une vue d'une collection view, tu constateras que c'est du délire.




     


    Bonjour Céroce,


    merci pour l'avis je vais éviter de m'engager sur du Collection View avant d'avoir regarder sérieusement de quoi il en retourne...

  • cela fait longtemps que je t'avais plus fait de dev OSX et maintenant que cela revient un peu, je peux dire qu'en venant d'iOS, là  où l'on a souvent des méthodes de delegate que l'on ne trouve pas sous OSX, il a souvent des notifications (par exemple pour détecter la fin d'un scroll)



  • Les collections views ne fonctionnent pas du tout de la même façon sous OS X, et tu vas voir qu'il s'agit d'une des pires classes d'App Kit. Cherche comment sélectionner une vue d'une collection view, tu constateras que c'est du délire.




    Je confirme. C'est une classe pratique pour afficher, par exemple, les images d'un dossier mais dès que l'on veut faire de la sélection ou pire de l'édition, on se dit flûte et on revient à  NSTableView.


     


    A propos, chroniques d'une mort annoncée: les cell-based NSTableView et... NSMatrix. Rhââ un jeu entier à  reconstruire...

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