AFNetworking UIImageView 需要滚动来加载图像
Posted
技术标签:
【中文标题】AFNetworking UIImageView 需要滚动来加载图像【英文标题】:AFNetworking UIImageView need scroll to load the images 【发布时间】:2013-10-09 09:57:32 【问题描述】:我正在使用 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;
【问题讨论】:
你能显示你的 setImageWithURL 吗? 它是一种 AFNetworking 方法。我正在考虑以我自己的方式使用成功块,然后在 UITableView 上使用 reloadRowAtIndexPath 方法,但必须有一些技巧,因为这是一个常见问题,我想 【参考方案1】:在UIImageView+AFNetworking类中已经有AFNetworking实现了这样的方法。
[imageView setImageWithURLRequest:request placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image)
blockImageView.image = image;
failure:nil];
请注意,如果您成功传入 nil,则图像将设置为您调用该方法的图像视图。在我的例子中是 imageView。
所以我想你可以根据需要重新加载数据。
【讨论】:
[cell.imageView setImageWithURLRequest:req placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) cell.imageView.image = image; [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 失败:无];如果它可以帮助任何人【参考方案2】:除了Peter Segerblom's answer,我建议使用__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;
【讨论】:
【参考方案3】:@pxpgraphics:我不得不替换
NSURLRequest *request = [NSURLRequest requestWithURL:imageURL];
与
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:imageURL]];
防止运行时错误。
【讨论】:
【参考方案4】: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)
【讨论】:
【参考方案5】:我认为这是最好的代码:
- (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;
【讨论】:
【参考方案6】:这篇文章有一个有效的答案: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");
这看起来很简单,无需根据索引路径重新加载单元格。
【讨论】:
【参考方案7】:这取决于单元格类型 - 如果您有一个自定义单元格,里面有自己的 UIImageView,请确保不要将其出口称为“imageView”!因为每个单元格内部已经有内部 imageView 。 我通过用 *myImageView 重命名链接的 IBOutlet 解决了这个问题,现在一切正常,代码:
[cell.myImageView setImageWithURL:[NSURL URLWithString:@"http://placehold.it/100x100"]];
【讨论】:
以上是关于AFNetworking UIImageView 需要滚动来加载图像的主要内容,如果未能解决你的问题,请参考以下文章
UIImageView+Afnetworking 无法正常工作
AFNetworking 和 UIImageView 更新线程问题
UIImageview+AFNetworking 淡入,图片缓存时也一样
使用 UIImageView+AFNetworking,图像直到滚动才会出现
使用 AFNetworking setImageWithURL 设置 UIImageView 圆角:
带有 UIActivityIndicatorView 参考内存的 UIImageView+AFNetworking 类别是不是保留?