dequeueReusableCellWithIdentifier导致UIImageView出现问题

时间:2011-08-20 16:21:48

标签: objective-c cocoa-touch uitableview

我正在加载一个包含500行的tableView。问题是在每一行中都有不同的图片。或者当我使用dequeueReusableCellWithIdentifier时,那些图片只是再次加载,我正在寻找的真实图片没有显示(我只有大约8张不同的图片:我的屏幕上加载了前8张图片)。如果我不使用dequeureReusableCellIdentifier,则会加载所有图片。但它会减慢显示吗?

这是代码(我目前正致力于缓存图片):

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CustomCellIdentifier = @"CustomCellIdentifier";
    UITableViewCell *cell = [tableView
                             dequeueReusableCellWithIdentifier: CustomCellIdentifier];

    NSLog(@"Launching CellForRowAtIndexPath");
    if (cell == nil) {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell"
                                                     owner:self options:nil];
        if ([nib count] > 0) {
            cell = self.profilCell;
        } else {
            NSLog(@"failed to load CustomCell nib file!");
        }
    }
    NSUInteger row = [indexPath row];
    NSDictionary *rowData = [listProfils objectAtIndex:row];
    UILabel *nameLabel = (UILabel *)[cell viewWithTag:nameValueTag];
    nameLabel.text = [rowData objectForKey:@"name"];
    NSString *finalId = [NSString stringWithFormat:@"http://graph.facebook.com/%@/picture", [rowData objectForKey:@"id"]];
    UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:finalId]]];
    [profilPic setImage:image];
    return cell;
}

感谢你! :)

2 个答案:

答案 0 :(得分:1)

看起来你有一个ivar profilPic可能是一个在你加载一个新的单元格笔尖时被链接的插座。如果是这种情况,它总是指向您加载的最后一个单元格,并且不会更改您刚刚出列的单元格中的图像。您可能希望以其他方式识别自定义视图,而不是使用插座,例如标记。因此,如果您将配置文件pic UIImageView的标记设置为100,例如,在Interface Builder中,您可以执行以下操作:

UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:finalId]]];
UIImageView* cellImageView = (UIImageView*)[cell viewWithTag:100];
[cellImageView setImage:image];

另外,我只想指出-dataWithContentsOfURL:将在主线程上同步加载URL。如果您在快速连接上在模拟器中进行测试,这将非常有效。但是,如果你在星期五下午在SoHo上使用3G ...你的应用程序可能会被监管机构杀死。

答案 1 :(得分:0)

我刚遇到这个问题,我的解决方案是持有一个私有NSMutableDictionary来存储以前从web异步加载的新图像,使用我的标识符作为键,UIImageView作为对象(因为我需要首先加载图标图像),当web图像准备就绪时,更改它,当tableView出列返回null时,我可以从我自己的缓存中读取原始UIImage

像这样。

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (!cell) {
    UIImageView *imageView = [thumbnailCache objectForKey:identifier];
    if (!imageView) {
        cell.imageView.image = [UIImage imageNamed:@"icon.png"];
        [thumbnailCache setObject:cell.imageView forKey:identifier];
    } else {
        cell.imageView.image = imageView.image;
    }
}

当我从网上加载实际图片时,请刷新缩略图缓存。

asynchronously_load_image_from_web(^(UIImage *image) {
    cell.imageView.image = image;
    [thumbnailCache setObject:cell.imageView forKey:identifier];
});