1

我在我的两个视图控制器中使用了相同的代码(它们实现了相同的类,它们下载的 url 发生了变化),并且在一种情况下,图像正确显示,而在另一种情况下,我确实看到了一个空单元格。

这是我的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *simpleTableIdentifier=@"MyCell";
    //this is the identifier of the custom cell
    MyCell *cell = (MyCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    tableView.backgroundColor=[UIColor clearColor];
    tableView.opaque=NO;
    tableView.backgroundView=nil;

    if (cell == nil)
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MyCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
    }
    NSLog(@"Image url is:%@",[images_url objectAtIndex:indexPath.row]);
    NSURL *url_image=[NSURL URLWithString:[images_url objectAtIndex:indexPath.row]];

    cell.myimage.image=[UIImage imageWithData:[NSData dataWithContentsOfURL:url_image]];


    return cell;
}

正如我告诉你的,我有 2 个视图控制器实现了同一个类。在确实加载的视图中,url 是根据标志的值设置的。如果我打开控制器 A,我看不到图像,如果我打开视图 B,我可以看到图像。这两个网址都是正确的,因为我可以使用我插入的 NSLog 检查它。

可能是什么问题?

4

1 回答 1

1

不幸的是,调用“NSData dataWithContentsOfURL”是一个阻塞调用。程序的执行将停止,直到 iOS 能够从服务器获取所有数据或尝试失败。如果您使用的是 LTE 或 WiFi,这通常可能“很快”;但可能需要很长时间。

同时,你在你的应用程序的“主线程”上——所以你的应用程序会出现冻结,系统的看门狗定时器可能会杀死你的应用程序。如果除您之外的任何人都将使用此应用程序,您绝对需要使用立即检索的本地数据或使用异步方法填充您的 tableview 单元格的图像。

只是谷歌“延迟加载 UIImage”。这个 SO question 有一些关于这个主题的好技巧: lazy-load-images-in-uitableview

此外,您应该将这些行移到一些设置代码中。您不需要每次都执行它们来更新单元格:

tableView.backgroundColor=[UIColor clearColor];
tableView.opaque=NO;
tableView.backgroundView=nil;

祝你好运!

于 2013-01-28T00:37:38.573 回答