4

AFNetworking を使用して UITableViewCell に画像を挿入しています。問題は、画像を見るためにテーブルをスクロールする必要があることです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
    Recipe *recipe = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = recipe.value;
    NSURL *url = [NSURL URLWithString:[BaseURLString stringByAppendingString:recipe.img]];
   [cell.imageView setImageWithURL:url];
    return cell;
}
4

7 に答える 7

4

UIImageView+AFNetworking カテゴリの AFNetworking によって既に実装されているこのようなメソッドがあります。

[imageView setImageWithURLRequest:request placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
    blockImageView.image = image;
} failure:nil];

成功して nil を渡すと、メソッドを呼び出した imageview にイメージが設定されることに注意してください。私の場合はimageView.

したがって、必要に応じてデータをリロードできると思います。

于 2013-10-09T10:58:43.733 に答える
1

これは使用するのに最適なコードだと思います:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *simpleTableIdentifier = @"SimpleTableItem";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
    }

    NSURL *url = [NSURL URLWithString:@"http://www.myimageurl.com"];  //Change this URL];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    __weak UITableViewCell *weakCell = cell;
    __weak UIImageView *weakImageView = cell.imageView;
    [cell.imageView setImageWithURLRequest:request placeholderImage:[UIImage imageNamed:@"granaziOrange"] success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
        weakImageView.image = image;
        [weakCell setNeedsLayout];
    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
        NSLog(@"Failed to get image");
    }];
    return cell;
}
于 2015-02-10T13:58:55.467 に答える
1

Peter Segerblom's answerに加えて__weak、blockImageVariable 変数の代わりに参照を使用して__block、保持サイクルを回避することをお勧めします。

を使用するだけ__blockでは、ポインタが別のメモリアドレスを参照しているため、imageView のコピーが割り当て解除されることはなく、tableView がなくなった後でもカウントは常に残ります。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    cell.textLabel.text = @"Cell text";

    NSURLRequest *request = [NSURLRequest requestWithURL:imageURL];
    __weak UITableView *weakTableView = tableView;
    __weak UITableViewCell *weakCell = cell;
    __weak UIImageView *weakImageView = cell.imageView;
    [cell.imageView setImageWithURLRequest:request
                          placeholderImage:placeholderImage
                                   success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
                                       weakImageView.image = image;
                                       if ([weakTableView.visibleCells containsObject:weakCell]) {
                                           [weakTableView reloadRowsAtIndexPaths:@[ indexPath ] withRowAnimation:UITableViewRowAnimationNone];
                                       }
                                 } failure:nil];

    return cell;
}
于 2014-01-28T05:19:30.020 に答える
0

セルの種類によって異なります。独自の UIImageView を内部に持つカスタム セルがある場合は、そのアウトレットを「imageView」と呼ばないようにしてください。すべてのセル内に既に内部 imageView があるためです。リンクされた IBOutlet の名前を *myImageView などに変更することで問題を解決したところ、すべてがコードで正常に動作するようになりました。

[cell.myImageView setImageWithURL:[NSURL URLWithString:@"http://placehold.it/100x100"]];
于 2015-04-22T14:22:38.007 に答える
0

この投稿には有効な回答があります: http://jabbleashish.blogspot.com/2013/12/setting-uitableviewcell-imageview-via.html

NSURLRequest *imageRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"YOUR_URL"]];
[cell.imageView setImageWithURLRequest:imageRequest placeholderImage:nil
success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image){
        NSLog(@"success");
        cell.imageView.image = image;
        cell.imageView.contentMode = UIViewContentModeScaleAspectFit;
        cell.imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        [cell setNeedsLayout];// To update the cell {if not using this, your image is not showing over cell.}
}failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error){
        NSLog(@"Failure");}

これは、インデックス パスに従ってセルをリロードする必要がなく、簡単に思えます。

于 2014-07-13T22:07:00.220 に答える