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 ответов:
Существует такой метод, уже реализованный 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"]];