我在我的两个视图控制器中使用相同的代码(他们正在实现相同的类,他们下载的URL会发生变化),并且在一个场合中,图像显示为correclty,而在另一个场景中,我确实看到一个空单元格。
这是我的代码:
- (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来检查它。
可能是什么问题?
答案 0 :(得分:1)
不幸的是,调用“NSData dataWithContentsOfURL”是一个阻塞调用。程序的执行将停止,直到iOS能够从服务器获取所有数据或尝试失败。如果您使用的是LTE或WiFi,这通常可能会“快速”;但可能需要很长时间。
与此同时,您正处于应用中的“主线程” - 因此您的应用似乎会冻结,系统的看门狗定时器可能会杀死您的应用。如果除了你之外的任何人都会使用这个ap,你绝对需要使用立即检索的本地数据或使用异步方法填充tableview单元格的图像。
只是谷歌“懒惰加载UIImage”。这个问题在这个问题上有一些很好的提示: lazy-load-images-in-uitableview
此外,您应该将这些行移动到某些设置代码。每次更新单元格时都不需要执行它们:
tableView.backgroundColor=[UIColor clearColor];
tableView.opaque=NO;
tableView.backgroundView=nil;
祝你好运!