3

tableView:cellForRowAtIndexPath呼び出して画像を設定する実験をしています

[self downloadImage:urlString andSetIntoCellImageView:cell]

downloadImage、それが呼び出されNSURLConnection:sendAsynchronousRequest(iOS 5 以降のみ)、完了ブロックで、を使用して画像を設定します

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

で、ダミーのプレースホルダー画像が取り込まれている場合に機能します-そして、新しい画像がどのように更新されるのだろうか、再描画を行うことtableView:cellForRowAtIndexPathによってですか? しかし、プレースホルダー画像を設定しないと、新しい画像はまったく表示されません。画像を表示するには、どのようなメカニズムを使用できるのだろうか。imageViewsetNeedsDisplay

私が使用する場合

[cell.imageView setNeedsDisplay]

また

[cell setNeedsDisplay];

完了ブロックでは機能しません。

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

downloadImageを受け入れて完了ブロックで、再度indexPath呼び出しtableView:cellForRowAtIndexPath、無限ループを引き起こします。そのため、画像が既にハッシュ テーブルにあるかどうかを覚えておくために、ハッシュ テーブルを使用する必要があるようdownloadImageです。

しかし、画像を表示させる簡単な方法はありますか? プレースホルダー画像の設定は機能しますが、そうでない場合はどうなりますか? プレースホルダーが画像の更新を引き起こすメカニズムは何ですか?

4

2 に答える 2

14

のメソッドが呼び出されると、のプロパティがの場合、UITableViewCellのフレームが与えられます。また、セルが表示されようとしているときと選択されているときなど、特定の状況でのみ呼び出されます。通常のスクロール時ではありません。これまで見てきたように、プレースホルダーの内側のサイズをゼロ以外のサイズに設定すると、その後の画像の変更が表示されます。-layoutSubviewsimageViewimagenilimageView(0,0,0,0)-layoutSubviewstableView:cellForRowAtIndexPath:cell.imageView

[cell setNeedsLayout]次のように、完了ハンドラーを呼び出して問題を修正しました。

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString: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];
                                            }];

完了ブロックがバックグラウンドで発生するため、メイン スレッドで UI 作業を実行する必要があることがわかりました。もちろん、このソリューションはセルの再利用などを考慮しませんが、少なくともセルの画像が表示されない理由を解決します:)

お役に立てれば!

于 2012-08-31T06:17:24.393 に答える
0

これはあなたの質問に直接答えるものではありませんが、問題の簡単な回避策は、代わりにSDWebImageを使用することです。cellForRowAtIndexPath:README ページの例は、まさにあなたがやろうとしていることを行います。

于 2012-08-31T05:35:33.993 に答える