2014-03-06 32 views
0

我遇到了一些代碼問題,看看你們是否可以幫我解決問題。我相當新的目標C和一般的iPhone編程,所以任何反饋將是驚人的。從解析的JSON呈現圖像的問題

我試圖從JSON文件解析url的flickr圖像。我成功地檢索了數據並創建了需要發送到UIImageView的url的字符串。不過,我似乎有一個問題,它顯示在屏幕上的圖像。唯一顯示在屏幕上的是我的UIImageView框,它是藍色的,但沒有來自flickr的圖像。我試圖找出問題的地方,我認爲它與我的photoURLS可變數組沒有正確初始化或某事有關,因爲當我從數組中打印出一個元素時,它會打印出來,但之後打印出它的空值。

如果你們可以看看幫我弄清楚什麼是錯的,甚至建議一個更好的替代方案,我想做的事情會很棒。

下面是我ViewController.h文件的唯一的事情:

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController 

@property(strong,nonatomic) NSMutableArray *photoURLS; 

@end 

下面是我在我ViewController.m文件中的代碼:

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 



-(id)init { 


    self = [super init]; 

    if(self) { 




     [self loadFlickrPhotos]; 

     return self; 
    } 
    return nil; 
} 

-(void)loadFlickrPhotos { 

NSString* urlstring = [NSString stringWithFormat:@"http://api.flickr.com/services/rest/?format=json&sort=random&method=flickr.photos.search&tags=rocket&tag_mode=all&api_key=0e2b6aaf8a6901c264acb91f151a3350&nojsoncallback=1"]; 
NSURL* url = [[NSURL alloc]initWithString:urlstring]; 

    self.photoURLS = [[NSMutableArray alloc]init]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
    NSDictionary *parsedObject = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 

    NSArray* photos = [[parsedObject valueForKey:@"photos"]objectForKey:@"photo"]; 

    for(NSDictionary* photo in photos) { 

     NSString* photoURLString = [NSString stringWithFormat:@"http://farm%@.static.flickr.com/%@/%@_%@_m.jpg", [photo objectForKey:@"farm"],[photo objectForKey:@"server"],[photo objectForKey:@"id"],[photo objectForKey:@"secret"]]; 


     [self.photoURLS addObject:[NSURL URLWithString:photoURLString]]; 




      } 
     NSLog(@"Photo #: %i", self.photoURLS.count); 
    } 

- (void)viewDidLoad 
{ 




    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
} 

-(void)viewDidAppear:(BOOL)animated { 



    NSData *imageData = [NSData dataWithContentsOfURL:[self.photoURLS objectAtIndex:0]]; 
    NSLog(@"Photo from url is: %@",[self.photoURLS objectAtIndex:35]); 
    UIImageView* imageView = [[UIImageView alloc]initWithFrame:CGRectMake(50, 50, 250, 250)]; 

    imageView.backgroundColor = [UIColor blueColor]; 

    imageView.image = [UIImage imageWithData:imageData]; 

    [self.view addSubview:imageView]; 

    [super viewDidAppear:YES]; 


} 
@end 

在控制檯當我嘗試檢查它是否工作它看起來像這樣:

2014-03-06 13:03:09.395 FlickrRocket[5011:11303] Photo #: 100 
2014-03-06 13:03:09.705 FlickrRocket[5011:11303] Photo from url is: http://farm4.static.flickr.com/3678/12943650293_faf143aca1_m.jpg 
2014-03-06 13:03:09.707 FlickrRocket[5011:11303] Photo from url is: (null) 
+0

你確定imageData在調用dataWithContentsOfURL之後不是零嗎? – Yaniv

+0

是的,當我試圖打印imageData而不是url時,它給了我同樣的東西「所有正確的數據,但之後說它是(空)」。所以不知道爲什麼控制檯打印兩次,因爲我只爲它創建了一個NSLog語句。 – user2942636

回答

0

不要在init中加載照片加載。 試試這個:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self loadFlickrPhotos]; 
} 

-(void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    NSData *imageData = [NSData dataWithContentsOfURL:[self.photoURLS objectAtIndex:0]]; 
    NSLog(@"Photo from url is: %@",[self.photoURLS objectAtIndex:35]); 
    UIImageView* imageView = [[UIImageView alloc]initWithFrame:CGRectMake(50, 50, 250, 250)]; 

    imageView.backgroundColor = [UIColor blueColor]; 

    imageView.image = [UIImage imageWithData:imageData]; 

    [self.view addSubview:imageView]; 
} 

- (void)loadFlickrPhotos 
{ 
    ... 
} 
+0

哦,哇,非常感謝,幫助:)你可能可以解釋我的問題是什麼?我仍然不習慣如何初始化作品以及如何首先調用作品。 – user2942636

+0

初始化在分配後被調用。在ViewController中,您通常會初始化您的成員變量,甚至不會重載它。 viewDidLoad是啓動加載操作的好地方。 viewDidAppear每次出現視圖時都會被調用。 在這種情況下,直接在viewDidLoad中加載圖像也是實用的,因爲如果視圖再次出現,它不需要重新加載。 (但這很大程度上取決於用例)。 – lootsch