Sur iOS, comment faire pour que cell.imageView actualise son contenu?

tableView:cellForRowAtIndexPath dans tableView:cellForRowAtIndexPath pour définir une image en appelant

 [self downloadImage:urlSsortingng andSetIntoCellImageView:cell] 

et dans downloadImage , il appellera NSURLConnection:sendAsynchronousRequest (iOS 5 et supérieur seulement), et dans le bloc d'achèvement, définissez l'image en utilisant

 cell.imageView.image = [UIImage imageWithData:data]; // data is downloaded data 

et cela fonctionne si dans tableView:cellForRowAtIndexPath , l' imageView est peuplé avec une image de placebo fictive – et je me request comment la nouvelle image est rafraichie, est-ce que setNeedsDisplay fait un repaint? Mais si je ne définis pas l'image de l'espace réservé, la nouvelle image ne s'affichera pas du tout. Je me request quel mécanisme peut être utilisé pour montrer l'image?

Si j'utilise

 [cell.imageView setNeedsDisplay] 

ou

 [cell setNeedsDisplay]; 

dans le bloc d'achèvement, cela ne fonctionnera pas, et si j'utilise

 [self.table reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 

Dans le bloc d'achèvement, en indexPath downloadImage accepter l' indexPath , il appelle à nouveau tableView:cellForRowAtIndexPath , et provoque une boucle infinie. Il semble donc que je doive utiliser une table de hachage pour me souvenir si l'image est déjà dans la table de hachage: sinon, appelez downloadImage , et si dans la table de hachage, utilisez simplement, donc il n'y aura pas de boucle infinie.

Mais existe-t-il un moyen facile de faire apparaître l'image? Définir une image d'espace réservé fonctionne mais que faire si nous ne le faisons pas – par quel mécanisme l'espace réservé provoque-t-il la régénération de l'image?

Lorsque la méthode -layoutSubviews est appelée, si image propriété image son imageView est nil , imageView reçoit une trame de (0,0,0,0) . En outre, -layoutSubviews ne doit être appelé que dans certaines situations: lorsque la cellule est sur le sharepoint devenir visible et lorsqu'elle est sélectionnée. Pas pendant le défilement normal. Donc, ce que vous avez vu est ce réglage de l'espace réservé dans tableView:cellForRowAtIndexPath: tailles cell.imageView à une taille non nulle et les changements ultérieurs de l'image seront visibles.

J'ai corrigé le problème en appelant [cell setNeedsLayout] dans le gestionnaire d'achèvement, comme ceci:

 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithSsortingng:MY_IMAGE_URL]]; [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { [[NSOperationQueue mainQueue] addOperationWithBlock:^{ UIImage *image = [UIImage imageWithData:data]; cell.imageView.image = image; [cell setNeedsLayout]; }]; 

J'ai trouvé le bloc d'achèvement qui se passe en arrière-plan, ce qui nécessite d'effectuer mon travail sur le thread principal. Bien sûr, cette solution ne tiendra pas count de la réutilisation des cellules et ainsi de suite, mais résout au less pourquoi l'image de la cellule n'apparaîtra pas 🙂

J'espère que cela t'aides!

Cela ne répond pas directement à votre question, mais un simple raccourci vers votre problème serait d'utiliser SDWebImage dans votre cellForRowAtIndexPath: place. L'exemple sur leur page README fait exactement ce que vous essayez de faire.