AFNetworking UIImageView нужна прокрутка для загрузки изображений


Я вставляю изображения в UITableViewCell с помощью AFNetworking. Проблема в том, что мне нужно прокрутить таблицу, чтобы увидеть изображения.

- (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;
}
7 4

7 ответов:

Существует такой метод, уже реализованный AFNetworking в категории UIImageView+AFNetworking.

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

Обратите внимание, что если вы успешно передадите значение nil, образ будет установлен в imageview, который вы вызываете методом on. В моем случае книги.

Так что здесь, я думаю, вы можете сделать перезагрузку данных, если вам нужно.

В дополнение к ответу Питера Сегерблома, я бы рекомендовал использовать ссылку __weak вместо переменной __block blockImageVariable, чтобы избежать цикла сохранения.

Если вы просто используете __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;
}

@pxpgraphics: мне пришлось заменить

NSURLRequest *request = [NSURLRequest requestWithURL:imageURL];

С

NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:imageURL]];

Для предотвращения ошибки во время выполнения .

Эквивалент Swift:

let request = NSURLRequest(URL: book.mediumImageURL)
cell.imageView.setImageWithURLRequest(request, placeholderImage: nil, success: { [weak cell] request, response, image in
    if cell {
        cell!.imageView.image = image
    }

    if tableView.visibleCells().bridgeToObjectiveC().containsObject(cell) {
        tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .None)
    }
}, failure:nil)

Я думаю, что это лучший код для использования:

- (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;
}

В этом посте есть ответ, который работает: 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");}

Это кажется простым без необходимости перезагрузки ячейки в соответствии с путем индекса.

Это зависит от типа ячейки - если у вас есть пользовательская ячейка с вашим собственным UIImageView внутри, убедитесь, что вы не называете ее выход "imageView"! Потому что внутри каждой клетки уже есть внутреннее изображение. Я решил эту проблему, переименовав связанный IBOutlet с чем-то вроде * myImageView, и теперь все работает нормально с кодом:

[cell.myImageView setImageWithURL:[NSURL URLWithString:@"http://placehold.it/100x100"]];