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
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];
}
- (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];
[[self listingTableView] reloadData];
} else {
}
}];
}
Réponses
Sous iOS, ce qu'on voit habituellement, c'est qu'on ajoute une catégorie sur UIImageView, avec une méthode du type:
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
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).
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)
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...