UITableviewCell在块内返回nil

时间:2014-03-25 10:25:07

标签: ios objective-c uitableview

我对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.tableViewindexPath在块内都不是零。

1 个答案:

答案 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;
}