我正在使用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;
}
答案 0 :(得分:4)
AFNetworking已经在UIImageView + AFNetworking类别中实现了这样一种方法。
[imageView setImageWithURLRequest:request placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
blockImageView.image = image;
} failure:nil];
请注意,如果您成功传入nil,则图像将设置为您调用方法的imageview。在我的情况下imageView。
所以我想你可以在需要时重新加载数据。
答案 1 :(得分:1)
除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;
}
答案 2 :(得分:1)
@pxpgraphics:我不得不替换
NSURLRequest *request = [NSURLRequest requestWithURL:imageURL];
带
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:imageURL]];
以防止运行时错误。
答案 3 :(得分:1)
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)
答案 4 :(得分: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;
}
答案 5 :(得分: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");}
这似乎很简单,无需根据索引路径重新加载单元格。
答案 6 :(得分:0)
它取决于单元格类型 - 如果你有一个自己的UIImageView自定义单元格,请确保你不要调用它的插座“imageView”!因为每个单元格内部都有内部imageView。 我通过使用* myImageView重命名链接的IBOutlet解决了这个问题,现在一切都可以正常使用代码:
[cell.myImageView setImageWithURL:[NSURL URLWithString:@"http://placehold.it/100x100"]];