如何在UITableViewCell中使图像顺利滚动?

时间:2011-11-16 23:30:04

标签: iphone objective-c cocoa-touch uitableview

我正在将图像加载到我的UITableViewCell中,它变得不稳定。我最多只有5-10个细胞。

有没有简单的方法可以解决这个问题?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"appointmentCell";

    AppointmentTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    NSDictionary *appointmentDictionaryTemp = [self.appointmentArray objectAtIndex:indexPath.row];
    cell.patientNameLabel.text = [appointmentDictionaryTemp objectForKey:@"patient"];
    cell.appointmentTimeLabel.text = [appointmentDictionaryTemp objectForKey:@"scheduled_time"];

    NSString *urlString = [[appointmentDictionaryTemp objectForKey:@"patient_small_photo_url"] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSData * imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];
    UIImage * image = [UIImage imageWithData:imageData];
    cell.patientImage.image = image; 

    return cell;
}

5 个答案:

答案 0 :(得分:2)

dataWithContentsOfURL:是你的罪魁祸首。它在应用程序的主UI线程上执行同步(阻塞)网络请求,导致表视图在下载图像时锁定。

解决方案涉及更多,它涉及使用NSURLConnection(或其他一些第三方库)异步下载数据,允许UI在下载图像时保持响应。 This是一个很好的资源,可供参考。

答案 1 :(得分:1)

创建一个名为imageCache的ivar,它是NSArray。现在在init

中运行此代码
for (NSDictionary *appointmentDictionaryTemp in self.appointmentArray) {        
    NSString *urlString = [[appointmentDictionaryTemp objectForKey:@"patient_small_photo_url"] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSData * imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];
    UIImage * image = [UIImage imageWithData:imageData];

    [imageCache addObject:image];
}

现在在cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"appointmentCell";

    AppointmentTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    NSDictionary *appointmentDictionaryTemp = [self.appointmentArray objectAtIndex:indexPath.row];
    cell.patientNameLabel.text = [appointmentDictionaryTemp objectForKey:@"patient"];
    cell.appointmentTimeLabel.text = [appointmentDictionaryTemp objectForKey:@"scheduled_time"];

    cell.patientImage.image = [imageCache objectAtIndex:indexPath.row]; 

    return cell;
}

答案 2 :(得分:0)

异步加载图像并可能缓存它们。首先阅读这个问题:Lazy load images in UITableViewCell

答案 3 :(得分:0)

使用索引路径作为密钥将图像存储在NSCache中,然后在您的 tableView:cellForRowAtIndexPath:方法,检查索引路径是否有对象。如果有将其加载到image属性中,如果没有,则调用方法生成它。这将在每次绘制单元格时停止它。

答案 4 :(得分:0)

有一个UIImageView图像的延迟/缓存网络的开源(MIT许可证)实现,你应该看一下:SDWebImage。以异步方式下载/缓存图像并自动更新UIImageViews。