0

所以我用我的 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);
}
4

1 回答 1

1

您出于两个完全不同的目的滥用变量“数组”。

根本原因是您没有费心为变量找到合理的名称。“数组”实际上是一个全局变量。它不仅可以从文件中的任何代码访问,而且可以从程序中任何位置的任何代码访问。看这段代码:

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

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

您首先将 JSON 数据解析为 allDataDictionary(您不必费心检查错误)。您从字典中访问一个键“jsontest2”并将其存储到全局变量“array”中。之前在“数组”中的任何东西现在都消失了。

然后你有一个for循环,使用与循环变量相同的全局变量!这完全是胡说八道。但是您还需要意识到这将遍历字典中的,因此数组现在是 NSString 而不是数组了。

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

逐行浏览您的代码。每一行,想想它在做什么。那里有很多严重的问题。

于 2014-03-14T23:04:46.563 回答