如何在之前加载uitableviewcell的图像

时间:2014-07-25 08:53:55

标签: objective-c uitableview objective-c-blocks objective-c-runtime

我在尝试阅读有关同样问题的方法时尝试了很多方法,但没有找到合适的答案,我决定直接询问。 这是我的任务。我喜欢用户启动我的应用程序并查看带有我从网上加载的图片的单元格,但我只看到了标题!

然后我向上滚动,屏幕上看不到一些单元格。

之后,我只看到该单元格的图像。

这是我的代码:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 5;
}

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reusbleCell];

    if (!cell) {
        cell =[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reusbleCell];
    }
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSURL *imageurl = [[NSURL alloc] initWithString:@"http://cs413627.vk.me/v413627067/604c/gD39fdeTH-E.jpg"];
        NSData *imageData = [[NSData alloc] initWithContentsOfURL:imageurl];
        dispatch_async(dispatch_get_main_queue(), ^{
            [[cell imageView] setImage:[UIImage imageWithData:imageData]];
        });
    });
    [[cell textLabel] setText:@"Text"];
    return cell;
}

2 个答案:

答案 0 :(得分:2)

我创建了一个测试项目来检查原因,我发现如果你在返回单元格之前没有设置cell.imageView.image,那么当接收到imageData时,cell.imageView.frame将是CGRectZero.So。你确实用imageData设置了imageView.image,但是永远不会显示图像。

我认为您可以使用自定义的UIImageView自定义UITableViewCell。

答案 1 :(得分:-1)

代码中的问题:正如在UIImageView的回答框架中所述,将是CGRectZero。因此,它不会反映您将设置的任何图像。

您可以创建自定义单元格并使用以下代码。

用以下内容替换您的代码:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSURL *imageurl = [[NSURL alloc] initWithString:@"http://cs413627.vk.me/v413627067/604c/gD39fdeTH-E.jpg"];
    NSData *imageData = [[NSData alloc] initWithContentsOfURL:imageurl];
    dispatch_sync(dispatch_get_main_queue(), ^{
        [cell.imageView setImage:[UIImage imageWithData:imageData]];
    });
});

其他解决方案可以使用 dispatch_sync 同步下载映像。但它是气馁的,因为它懒洋洋地加载图像。

  

请注意,UI应始终在主线程上更新。