8

SDWebImageニュース API からニュース記事に関連付けられた画像を使用して取得しています。

問題は、画面上でスクロールを開始するまで、画面上のセルの画像が読み込まれないUITableViewことです。セルをスクロールして画面から消えると、セルに戻ると、最終的に画像が読み込まれます。

これが私の(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPathコードです:

if ([feedLocal.images count] == 0) {
    [cell.imageView setImage:[UIImage imageNamed:@"e.png"]];
}
else {    
    Images *imageLocal = [feedLocal.images objectAtIndex:0];
    NSString *imageURL = [NSString stringWithFormat:@"%@", imageLocal.url];
    NSLog(@"img url: %@", imageURL);

    // Here we use the new provided setImageWithURL: method to load the web image
    __weak UITableViewCell *wcell = cell;
    [cell.imageView setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@", imageURL]]
                   placeholderImage:[UIImage imageNamed:@"115_64.png"]
                          completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {
                              if(image == nil) {
                                  [wcell.imageView setImage:[UIImage imageNamed:@"115_64.png"]];
                                   //];
                              }
                          }
    ];
}

なぜこれが起こっているのでしょうか?UITableView が読み込まれると、スクロールが始まるまで画像が読み込まれないか、何かのように見えますか?

どんな提案でも大歓迎です、ありがとう!

4

4 に答える 4

1

問題が解決したかどうかはわかりませんが、次のコードで問題を解決できます。

基本的な考え方は、ブロック内で使用可能なセル参照を設定し、完成したメソッドでセルの画像を手動で設定することです。それが役に立てば幸い。

__block UITableViewCell *cell2 = cell;

id data = [[self itemArray] objectAtIndex:[indexPath item]];

if ([data isKindOfClass:[MyItems class]]) {

    MyItems *myData = (MyItems *)data;
    [[cell2 imageView] setImageWithURL:[myData url]
                      placeholderImage:[UIImage imageNamed:@"placeHolder.png"]
                             completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {
                                 // do check that this is the right cell to put your image
                                 // your methods here

                                 if (image) {
                                     [[cell2 imageView] setImage:image];
                                 }
    }];
}

それが正しいセルかどうかの確認については、次のようなものだと思います(確認する時間がありません)

__block UITableViewCell *cell2 = cell;

id data = [[self itemArray] objectAtIndex:[indexPath item]];

if ([data isKindOfClass:[MyItems class]]) {

    __block MyItems *myData = (MyItems *)data;
    [[cell2 imageView] setImageWithURL:[myData url]
                      placeholderImage:[UIImage imageNamed:@"placeHolder.png"]
                             completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {
                                 // do check that this is the right cell to put your image
                                 // your methods here
                                 id currentData = [[self itemArray] objectAtIndex:[indexPath item]];
                                 if ([currentData isKindOfClass:[MyItems class]] && [ [[(MyItems *)currentData url] absoluteString] isEqualToString:[[myData url] absoluteString] ]) {
                                 // it is the right cell to put in :)
                                     if (image) {
                                         [[cell2 imageView] setImage:image];
                                     }
                                 }
    }];
}
于 2013-07-19T08:31:50.983 に答える
0

以前に同様の問題に遭遇したことがあり、テーブルビューの画像が正しくダウンロードされていることが判明しました。あなたが直面している本当の問題は、更新の問題です。各画像がダウンロードされると、テーブルビューに表示されるように更新する必要があります。私の場合、ダウンロード部分は別のファイルで行われたので、NSNotificationCenter を使用して、tableview コントローラー クラスに更新するように指示しました。コードでできることは次のとおりです。

if ([feedLocal.images count] == 0) {
    [cell.imageView setImage:[UIImage imageNamed:@"e.png"]];
}
else {    
    Images *imageLocal = [feedLocal.images objectAtIndex:0];
    NSString *imageURL = [NSString stringWithFormat:@"%@", imageLocal.url];
    NSLog(@"img url: %@", imageURL);

    // Here we use the new provided setImageWithURL: method to load the web image
    __weak UITableViewCell *wcell = cell;
    [cell.imageView setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@", imageURL]]
                   placeholderImage:[UIImage imageNamed:@"115_64.png"]
                          completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {
                              if(image == nil) {
                                  [wcell.imageView setImage:[UIImage imageNamed:@"115_64.png"]];
                                  [[NSNotificationCenter defaultCenter] postNotificationName:@"ImageDownloaded" object:nil];
                                   //];
                              }
                          }
    ];
}

そして、以下のようにそれを使用してリロードデータを呼び出すことができます:

- (void) imageDownloaded:(NSNotification *)notification{

    [self.tableView reloadData];
}

この方法では、画像を表示するためにスクロールする必要はありません。代わりに、画像がダウンロードされた直後に表示されます。

お役に立てれば!

于 2013-07-07T20:11:42.837 に答える
0
NSString *mainimg=[NSString stringWithFormat:@"%@",[[xmlDataDictionary valueForKeyPath:@"eg.main.img1"]objectAtIndex:indexPath.row]];
NSURL *url = [NSURL URLWithString:mainimg];
NSData *imge = [[NSData alloc] initWithContentsOfURL:url];
cell.img.image=[UIImage imageWithData:imge];
于 2014-05-21T13:02:51.643 に答える