Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

iOS

Downloading JSON image Problem

Hello guys, i made an exercise for the Master Detail Application regarding how to downloading the data using JSON and display it in table view. I can set the title and author using JSON but i have a little problem with images ( thumbnail ). The code doesn't give me any error but when i ran the application they give me an error " [__NSCFString isFileURL]: unrecognized selector sent to instance 0x8c9d5c0 " . Here is my code for MasterViewController.h

#import <UIKit/UIKit.h>

@interface MasterViewController : UITableViewController

@property (strong, nonatomic) NSArray *tajuk;

@end

and here is my code for MasterViewController.m

#import "MasterViewController.h"

#import "DetailViewController.h"

@interface MasterViewController () {
    NSMutableArray *_objects;
}
@end

@implementation MasterViewController

- (void)awakeFromNib
{
    [super awakeFromNib];
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //self.tajuk = [NSArray arrayWithObjects:@"barca",@"kelate",@"jdt", nil];

    NSURL *url = [NSURL URLWithString:@"http://blog.teamtreehouse.com/api/get_recent_summary/"];
    NSData *jsonData = [NSData dataWithContentsOfURL:url];
    NSError *error = nil;
    NSDictionary *dataDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];

    self.tajuk = [dataDictionary objectForKey:@"posts"];

//    NSLog(@"%@", dataDictionary);

    self.navigationItem.leftBarButtonItem = self.editButtonItem;

    UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)];
    self.navigationItem.rightBarButtonItem = addButton;
}

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

- (void)insertNewObject:(id)sender
{
    if (!_objects) {
        _objects = [[NSMutableArray alloc] init];
    }
    [_objects insertObject:[NSDate date] atIndex:0];
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}

#pragma mark - Table View

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

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

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

    NSDictionary *dataFromWeb = [self.tajuk objectAtIndex:indexPath.row];

   // self.URL = [NSURL URLWithString:[dataFromWeb objectForKey:@"thumbnail"]];

//    NSString *object = self.tajuk[indexPath.row];
    cell.textLabel.text = [dataFromWeb objectForKey:@"title"];

   // NSLog(@"%@", [dataFromWeb objectForKey:@"thumbnail"]);

    if([[dataFromWeb objectForKey:@"thumbnail"] isKindOfClass:[NSString class]]) {

        NSData *imageData = [NSData dataWithContentsOfURL:[dataFromWeb objectForKey:@"thumbnail"]];
        UIImage *image = [UIImage imageWithData:imageData];
        cell.imageView.image = image;
        NSLog(@"%@", [dataFromWeb objectForKey:@"thumbnail"]);

    } else {

        cell.imageView.image = nil;

   }

    return cell;
}



- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"showDetail"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        NSDictionary *dataWeb = [self.tajuk objectAtIndex:indexPath.row ];
        NSString *objek = [dataWeb objectForKey:@"author"];
        //NSString *object = self.tajuk[indexPath.row];
        [segue.destinationViewController setDetailItem:objek];
    }
}

@end

I got a breakpoint error at this line

NSData *imageData = [NSData dataWithContentsOfURL:[dataFromWeb objectForKey:@"thumbnail"]];

3 Answers

Thomas Nilsen
Thomas Nilsen
14,957 Points

[NSData dataWithContentsOfURL:] takes an NSURL. You need to put [dataFromWeb objectForKey:@"thumbnail"] (which is a string), into an NSURL first.

It would look something like this:

 NSURL *url = [NSURL URLWithString:[dataFromWeb objectForKey:@"thumbnail"]];
 NSData *imageData = [NSData dataWithContentsOfURL:url];

Thanks Thomas, now i solved my problem.

Thanks Thomas, now i solved my problem.