0

だから私は私のJSONでUICollectionViewを使っています。私はこのコードを解析用に書いていますが、なぜそれが機能しないのか理解できません。私のJSONは(キー「imageMain」の後に[jsontest2])を持っています。

だから私は私のコードを貼り付けます、私を助けてください:

   @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

変数「配列」を2つのまったく異なる目的で悪用しています。

根底にある理由は、変数の妥当な名前をわざわざ見つけていないことです。「配列」は実際にはグローバル変数です。ファイル内の任意のコードからアクセスできるだけでなく、プログラム内の任意のコードからもアクセスできます。このコードを見てください:

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

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

まず、JSON データを allDataDictionary に解析します (エラーをチェックする必要はありません)。辞書から 1 つのキー「jsontest2」にアクセスし、それをグローバル変数「array」に格納します。以前「配列」にあったものはすべてなくなりました。

次に、ループ変数と同じグローバル変数を使用して for ループを作成します。それはまったくナンセンスです。ただし、これは辞書内のキーを反復処理することも認識する必要があるため、配列は配列ではなく NSString になりました。

その後、コードは悪化します...

コードを 1 行ずつ見ていきます。すべての行で、それが何をしているのかを考えてください。そこには多くの深刻な問題があります。

于 2014-03-14T23:04:46.563 に答える