在 iPhone 中从 NSMutableArray 填充数据

Posted

技术标签:

【中文标题】在 iPhone 中从 NSMutableArray 填充数据【英文标题】:Populating Data from NSMutableArray in iPhone 【发布时间】:2012-06-07 06:45:17 【问题描述】:

我有三个数组,我已将所有这些数组复制到一个数组中。所有这三个数组都是字典数组。所有数组都有一个名为图片的字段,但图片来自不同的来源 - 一个数组中的 URL,另一个数组中的数据和第三个数组中的文件。

说,Array1 有一个带有关键图片的字典,它从NSURL 加载。 同样,Array2 和 Array3 具有相同键名的字典 - 图片并从 ContentofFilesNSData 加载。

现在,我想填充tableview,当然,我有Custom UITableViewCell,它有图像视图作为它的内容视图。要加载该图像,我应该怎么做。

我正在做这件事..

NSURL *url  = [NSURL URLWithString:[[contactList objectAtIndex:indexPath.row] objectForKey:@"picture"]];
cell.contactImageView.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];

但是,如果cell.contactImageView.image 没有从 NSURL 接收到图像,这将崩溃。那么,我该怎么办?任何帮助,将不胜感激

但是,

【问题讨论】:

【参考方案1】:

您只需检查接收到的图像是否为空,如果是,则在未选择个人资料图片时设置一个模板照片图像,称为 no photo like a photo on facebook

    UIImage *img = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
    if (img)
       cell.contactImageView.image = img;
    else
       cell.contactImageView.image = [UIImage imageNamed:@"no_photo.png"];

【讨论】:

您输入的内容与我要输入的内容相同(因此 +1 给您),但我还将添加详细信息,用于像这样的依赖于服务器的内容(事情可能会失败或失败) nil 出乎意料),一般来说,应该在一行Objective C代码中投入这么多。 @MichaelDautermann 当你看到一些帖子需要修改时,只需编辑它,我关心想法,你应该编辑我的帖子 我将编辑帖子以修复语法和拼写问题,但不会更改大量代码。您的代码 sn-p 没有问题,但是在 Surya 的代码中,他/她正在与 objectAtIndex 同一行执行 objectForKey,并在 dataWIthCONtentsOfURL 之后加上 imageWithData(并且没有任何错误检查)。难怪会发生崩溃! @Michael Dautermann:只有当图片不是来自 URL 时才会崩溃,否则它运行良好,如果您想提出任何建议,欢迎您。 @The Saad:但它在这一行 NSURL *url = [NSURL URLWithString:[[contactList objectAtIndex:indexPath.row] objectForKey:@"picture"]]; 中崩溃,因为我认为“ URLWithString” 没有得到正确的 URL,它正在获取数据。那么,现在该怎么办?【参考方案2】:

如果这些图片是从网上检索到的,我建议不要使用[NSData dataWithContentsOfURL:]

您应该使用异步加载图像的非阻塞方法。对表中的大量行使用此方法会导致性能问题。

这是我的建议,使用 SDWebImage Library 。易于使用,甚至更易于安装。

将库添加到项目后,只需 #import UIImageView+WebCache.h 类用法示例如下。

 [cell.contactImageView.image setImageWithURL:[NSURL URLWithString:[[contactList objectAtIndex:indexPath.row] objectForKey:@"picture"]]
               placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

【讨论】:

【参考方案3】:

您可以在字典中再添加一个键,该键将指定从哪里拍照,因此如果您想提供来自不同来源的图像,您可以将图像提供给 cell.contactImageView。

【讨论】:

【参考方案4】:

非常感谢您的快速回复,尤其是@skram,由于您的建议,我的 tableview 性能提高了很多。我问过的问题,我想到的更好的答案是使用iskindofClass。如果图像来自任何类,在某种条件下,我们可以检查该图像的来源并相应地填充我们的图像。

if ([[[contactList objectAtIndex:indexPath.row] objectForKey:@"picture"] isKindOfClass:[UIImage class]]) 
    
        cell.contactImageView.image = [[contactList objectAtIndex:indexPath.row] objectForKey:@"picture"];
    
    else if ([[[contactList objectAtIndex:indexPath.row] objectForKey:@"picture"] isKindOfClass:[NSString class]]) 
    
        cell.contactImageView.image = [[contactList objectAtIndex:indexPath.row] objectForKey:@"picture"];
    
    else if([[[contactList objectAtIndex:indexPath.row] objectForKey:@"picture"] isKindOfClass:[NSURL class]])
    
        [cell.contactImageView setImageWithURL:[NSURL URLWithString:[[contactList objectAtIndex:indexPath.row] objectForKey:@"picture"]]placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
    

现在,我可以正确填充表格视图了。再次感谢scram

【讨论】:

以上是关于在 iPhone 中从 NSMutableArray 填充数据的主要内容,如果未能解决你的问题,请参考以下文章

在 iPhone 中从 PDF 中搜索单词

在 iPhone 中从 NSMutableArray 填充数据

无法在 iphone 单元测试中从 NSBundle 加载文件

在 ios6 中从 iPhone 相机捕获全景图像

在 Unity3d 中从 iphone 加载图像

如何在 iPhone sdk 中从 ViewController 绘制一个矩形