在tableview中显示json文件中的图像

时间:2014-07-28 15:29:14

标签: ios json uitableview uiimage

我有一个json数组,我使用以下方法来检索数据:

- (void) retrieveData
{
    NSURL * url = [NSURL URLWithString:getDataURL];
    NSData * data = [NSData dataWithContentsOfURL:url];
    jsonArray = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];

    //set up cities array
    dronesArray = [[NSMutableArray alloc] init];

    //Loop json array
    for (int i = 0; i < jsonArray.count; i++)
    {
        //Create city/drone object
        NSString * dID = [[jsonArray objectAtIndex:i] objectForKey:@"id"];
        NSString * dName = [[jsonArray objectAtIndex:i] objectForKey:@"droneName"];
        NSString * dPic = [[jsonArray objectAtIndex:i] objectForKey:@"dronePic"];
        [dronesArray addObject:[[City alloc]initWithDroneName:dName andDronePic:dPic]];
    }
}

以上显示细胞正常:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    // Configure the cell...

    City * droneObject;
    droneObject = [dronesArray objectAtIndex:indexPath.row];

    cell.textLabel.text = droneObject.droneName;

    //Accessory
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    return cell;
}

但它只显示名称,没有图像。图像以URL格式存储,例如sql数据库中的http://www.domain.com/image.jpg。如何导入图像使其看起来像这样的格式:

enter image description here

好的所以我将以下代码添加到cellforrowatindexpath并且它没有做任何事情:

[[cell imageView] setImage: [UIImage imageNamed:droneObject.dronePic]];

4 个答案:

答案 0 :(得分:1)

每当您需要从网址下载图像并将其设置为UIImageView时。最好的机制是从URL获取图像并将它们存储在缓存中,并将下载的图像设置为UITableView。

现在,当您滚动tableView时,其内容将被更新,您需要检查是否已下载特定的可见单元格图像,如果已下载,则将其设置为UIImageView,否则从服务器下载。

为了做到这一点,请高效地使用SDWebImage库。这是最值得信赖且易于使用的库。

希望这会对你有所帮助。快乐编码:)

答案 1 :(得分:1)

假设您正在尝试从url字符串中获取图像

    NSURL *url = [NSURL URLWithString:droneObject.dronePic];
    NSData *data = [NSData dataWithContentsOfURL:url];
    UIImage *image = [UIImage imageWithData:data];
    [[cell imageView] setImage: [UIImage imageNamed:image]];

答案 2 :(得分:0)

简答:使用AFNetworking及其UIImageView类别在imageView <中设置单元格的cellForRowAtIndexPath:图像/ p>

https://github.com/AFNetworking/AFNetworking/blob/master/UIKit%2BAFNetworking/UIImageView%2BAFNetworking.h

答案很长?

没有图片,因为您没有将单元格的imageView image属性设置为cellForRowAtIndexPath:中的任何内容。如果您只使用网址,则可能需要考虑异步加载和设置单元格上的图像,以便在滚动时桌面不会锁定。如果您不熟悉它,这可能是一个棘手的概念。

无论如何,有很多方法可以做到这一点(AFNetworking解决方案可以为您提供开箱即用的功能):

答案 3 :(得分:0)

这就是我做的。您拉取json数据的部分,通过从URL字符串中检索图像来存储图像。

connectionDidFinishLoading
    for (int i = 0; i < jsonArray.count; i++)
    {
        NSDictionary *jsonElement = jsonArray[i];
        Movies *newMovie = [[Movies alloc] init];
        newMovie.name = jsonElement[@"MovieID"];

        NSString *urlString = [NSString stringWithFormat:@"*url of the image*%@", jsonElement[@"fileImage"]]; 
        // www.example.com/img%@, /filename.jpg
        NSURL *imageURL = [NSURL URLWithString:urlString];
        NSData *imageData = [NSData dataWithContentsOfURL:imageURL];
        UIImage *image = [UIImage imageWithData:imageData];

        newMovie.imageName = image;
        [_movies addObject:newMovie];
    }

我创建了一个名为Movies的NSObject来存储图像和其他字段。

Movies.h
    @property (nonatomic, strong) NSString *name;
    @property (nonatomic, strong) UIImage *imageName;

在我的cellForRowAtIndexPath中,我创建了一个imageview,并将该图像设置为与Movies.h中的UIImage相同。

cellForRowAtIndexPath:
    Movies *item = _feedItems[indexPath.row];
    myImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,50,50)];
    myImageView.tag = indexPath.row;
    myImageView.image = item.imageName;
    [myCell addSubview:myImageView];

    return myCell;

_feedItems是一个NSArray

- (void)itemsDownloaded:(NSArray *)items
{
    _feedItems = items;
    [self.listTableView reloadData];
}