使用解析加载UITableViewCell图像

时间:2014-08-14 10:55:34

标签: ios parsing uitableview uiimageview

我遵循了JSON解析教程并修改了我的RSS提要,如果xxxxxxxx在标签中发布特色图片,现在我需要将每个图像链接分配给它标题旁边的相应行。

我在nsmutablestring中保存了链接并使用它的url将其分配给我的图像

cell.imageView.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[[feeds objectAtIndex:indexPath.row] objectForKey: @"thumbnail"]]]];

但它不起作用,这是我申请的唯一部分,请帮助我完成它

这是我的代码

#import "APPMasterViewController.h"
#import "APPDetailViewController.h"

@interface APPMasterViewController () {
    NSXMLParser *parser;
    NSMutableArray *feeds;
    NSMutableDictionary *item;
    NSMutableString *title;
    NSMutableString *link;
    NSMutableString *thumbnail;
    NSString *element;

}
@end

@implementation APPMasterViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    feeds = [[NSMutableArray alloc] init];
    NSURL *url = [NSURL URLWithString:@"http://icuore.ly/feed"];
    parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
    [parser setDelegate:self];
    [parser setShouldResolveExternalEntities:NO];
    [parser parse];

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - Table View

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return feeds.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    cell.textLabel.text = [[feeds objectAtIndex:indexPath.row] objectForKey: @"title"];

    cell.imageView.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[[feeds objectAtIndex:indexPath.row] objectForKey: @"thumbnail"]]]];

    return cell;
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {

    element = elementName;

    if ([element isEqualToString:@"item"]) {

        item    = [[NSMutableDictionary alloc] init];
        title   = [[NSMutableString alloc] init];
        link    = [[NSMutableString alloc] init];
      thumbnail = [[NSMutableString alloc] init];
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

    if ([elementName isEqualToString:@"item"]) {

        [item setObject:title forKey:@"title"];
        [item setObject:link forKey:@"link"];
        [item setObject:thumbnail forKey:@"thumbnail"];

        [feeds addObject:[item copy]];
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

    if ([element isEqualToString:@"title"]) {
        [title appendString:string];
    } else if ([element isEqualToString:@"link"]) {
        [link appendString:string];
    }
    else if ([element isEqualToString:@"thumbnail"]) {
        [thumbnail appendString:string];
    }
}

- (void)parserDidEndDocument:(NSXMLParser *)parser {
    [self.tableView reloadData];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"showDetail"]) {

        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        NSString *string = [feeds[indexPath.row] objectForKey: @"link"];
        [[segue destinationViewController] setUrl:string];
    }
}

@end

2 个答案:

答案 0 :(得分:0)

您的图片未显示的原因是因为您的图片在调用cellForRowAtIndexPath:之前尚未完成下载。请记住,此方法负责显示UITableView的单元格。使用来自Internet的数据设置单元格时,在完成下载后重新加载UITableView的数据非常重要。我建议使用NSURLSession完成此操作以下载您的映像,因为它有代理处理下载更新。例如,其中一个代表是:

URLSession:downloadTask:didFinishDownloadingToURL:

实施此委托后,将在会话下载完成后调用该委托。假设,在所述代表中,您将更新图片视图并致电[tableView reloadData]

答案 1 :(得分:0)

我找到了正确的方法

//cell image set
    NSString *imageStr = [[feeds objectAtIndex:indexPath.row] objectForKey: @"thumbnail"];
    NSString *trimmedString = [imageStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    NSString *string1=[trimmedString stringByReplacingOccurrencesOfString:@"/n" withString:@""];
    NSURL *url = [NSURL URLWithString:string1];
    NSData *data = [NSData dataWithContentsOfURL:url];
    UIImage *newImage = [UIImage imageWithData:data];
    cell.imageView.image = newImage;
    return cell;

我希望它可以帮助你们所有人