如何将图像从JSON解析到UICollectionView

时间:2014-03-14 22:40:32

标签: json uicollectionview uicollectionviewcell uicollectionviewdelegate

所以我使用我的JSON使用UICollectionView。我为解析编写了这段代码,但我不明白为什么它不起作用。我的JSON有(#jsontest2]后键" imageMain")。

所以我粘贴我的代码,请帮助我:

   @property (nonatomic,strong) NSMutableArray *patternImagesArray;

@end

@implementation ViewController

@synthesize patternImagesArray = _patternImagesArray;

NSURLConnection *connection;
NSMutableData *webdata;

尝试从JSON获取数据:

-(void) viewDidLoad{

    _patternImagesArray = [[NSMutableArray alloc] init];

    NSURL *url = [NSURL URLWithString:@"site"];


    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    connection = [NSURLConnection connectionWithRequest:request delegate:self];
    if (connection) {
        webdata = [[NSMutableData alloc]init];

    }

}


-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [webdata setLength:0];
}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [webdata appendData:data];
}

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{


}

JSON解析:

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSDictionary *allDataDictionary = [NSJSONSerialization JSONObjectWithData:webdata options:0 error:nil];
    NSArray *tmp =[allDataDictionary objectForKey:@"jsontest2"];
    if (tmp.count>0){

        for (NSDictionary *diction in tmp) {
            [self.patternImagesArray addObject:diction];
        }


        NSLog(@"%@", self.patternImagesArray);


    }
    [self.collectionView reloadData];
}

一些定制的东西:

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{

    PatternView *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"PatternCell" forIndexPath:indexPath];

    NSString *myPatternString = [[self.patternImagesArray objectAtIndex:indexPath.row] valueForKey:@"thumb"];
    NSLog(@"myPatternString %@",myPatternString);
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:myPatternString]];
    cell.patternImageView.image = [UIImage imageWithData:data];


    return cell;


}

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
    return 1;
}

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
    return [self.patternImagesArray count];
}



-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{

    return CGSizeMake(100.0, 100.0);
}

1 个答案:

答案 0 :(得分:1)

你正在滥用变量" array"两个完全不同的目的。

潜在的原因是你没有为变量寻找合理的名称而烦恼。 "阵列"实际上是一个全局变量。它不仅可以从您文件中的任何代码访问,还可以从程序中任何位置的任何代码访问。看看这段代码:

NSDictionary *allDataDictionary =[NSJSONSerialization JSONObjectWithData:_webdata 
                                          options:kNilOptions  error:nil];

array =[allDataDictionary objectForKey:@"jsontest2"];
for (array in allDataDictionary) {
}

首先将JSON数据解析为allDataDictionary(您不必费心检查错误)。您可以访问一个键" jsontest2"从字典中将其存储到全局变量" array"中。无论在"阵列"之前现在已经过去了。

然后你有一个for循环,使用与循环变量相同的全局变量!这完全是胡说八道。但是你还需要意识到这会迭代你字典中的 keys ,所以数组现在是一个NSString而不再是一个数组。

之后你的代码变得更糟......

逐行浏览您的代码。每一行,都要考虑它在做什么。那里有许多严重的问题。