我对tableView:cellForRowAtIndexPath:
的实施如下:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
BSProductCell *cell = [tableView dequeueReusableCellWithIdentifier:BSProductCellIdentifier];
cell.productImageView.image = [UIImage imageNamed:@"Placeholder"];
[[BSImageLoader sharedInstance] getImageWithURL:self.dataSourceArray[indexPath.row] withCompletionBlock:^(UIImage *image, BOOL fromCache, NSString *error){
BSProductCell *tableCell = (BSProductCell *)[self.tableView cellForRowAtIndexPath:indexPath];
[tableCell.productImageView setImage:image];
NSLog(@"%@", tableCell);
}];
return cell;
}
getImageWithURL:withCompletionBlock:
如果在本地缓存中找不到它,或者只是从缓存中返回,则从指定的URL下载图像。首先,当视图加载并且单元格被填充时,所有事情都按预期进行:图像被下载然后放置在单元格内。问题是当我开始滚动tableview时,NSLog显示(null)
。我只是无法弄清楚为什么tableCell
对象为空。
PS:我按照几乎相同的example from Apple后写了我的例子。
我也检查过,self.tableView
和indexPath
在块内都不是零。
答案 0 :(得分:0)
该块是异步的,您应该在块外部创建单元格,并且只在内部设置图像:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
BSProductCell *cell = [tableView dequeueReusableCellWithIdentifier:BSProductCellIdentifier];
if(cell==nil){
cell = [[BSProductCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:BSProductCellIdentifier];
}
cell.productImageView.image = [UIImage imageNamed:@"Placeholder"];
[[BSImageLoader sharedInstance] getImageWithURL:self.dataSourceArray[indexPath.row] withCompletionBlock:^(UIImage *image, BOOL fromCache, NSString *error){
//Here you check that the cell is still displayed
if([tableView cellForRowAtIndexPath:indexPath]){
[cell.productImageView setImage:image];
NSLog(@"%@", cell);
}
}];
return cell;
}