2012-01-31 12 views
0

私はJSONファイルを持っており、そこから値を抽出してテーブルビューに表示する必要があります。すべてうまく動作します。JSONファイルからCellに値を追加 - コード提供

{ 
    "1": { 
     "name": "Jemmy", 
     "birthday": "1994-11-23" 
    }, 
    "2": { 
     "name": "Sarah", 
     "birthday": "1994-04-12" 
    }, 
    "3": { 
     "name": "Deb", 
     "birthday": "1994-11-23" 
    }, 
    "4": { 
     "name": "Sam", 
     "birthday": "1994-11-23" 
    } 
} 

私は値を表示すると、レコードに指定されている1,2,3,4の順番で表示されません。ただランダムに表示されます。私は下に私のコードを含めて、私はそれが上記の順序でコンテンツを表示することができるように変更する必要があります。誰かが助けてくれますか?

- (void)requestSuccessfullyCompleted:(ASIHTTPRequest *)request{ 
       NSString *responseString = [request responseString]; 
       SBJsonParser *parser = [SBJsonParser new];    
       id content = [responseString JSONValue]; 
       if(!content){  
        return; 
       } 
       NSDictionary *personDictionary = content; 
       NSMutableArray *personMutableArray = [[NSMutableArray alloc] init]; 
       for (NSDictionary *childDictionary in personDictionary.allValues) 
       { 
        Deal *deal = [[Deal alloc] init];    
        deal.name=[childDictionary objectForKey:@"name"]; 
        deal.dob=[childDictionary objectForKey:@"birthday"]; 
        [personMutableArray addObject:deal]; 
       }   
       self.personArray = [NSArray arrayWithArray:personMutableArray];  
    } 

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     static NSString *CellIdentifier = @"Cell"; 
     Cell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
     if (cell == nil) {   
      Person *person = [self.personArray objectAtIndex:indexPath.row];   
      cell = [[Cell alloc] initWithStyle:UITableViewCellStyleDefault 
           reuseIdentifier:CellIdentifier]; 
      cell.namelabel.text=person.name; 
      cell.doblabel.text=person.dob; 
     } 
     return cell; 
    } 

答えて

1

セルを正しく再利用していません。セルが再使用されている場合は、セルの構成に失敗します。

あなたcellForRowAtIndexPath:この方法でなければなりません。これが正しいARCコードですが、事前にARCに、あなたは[Cell alloc]行の末尾にautoreleaseを追加する必要があること

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    Cell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) {   
     cell = [[Cell alloc] initWithStyle:UITableViewCellStyleDefault 
          reuseIdentifier:CellIdentifier]; 
    } 
    Person *person = [self.personArray objectAtIndex:indexPath.row];   
    cell.namelabel.text=person.name; 
    cell.doblabel.text=person.dob; 
    return cell; 
} 

注意。

+0

私はARCを使用しています。私が 'cell.namelabel'と' cell.doblabel'をif条件の外に(あなたが示したように)追加すると、スクロールするときにセルが重なることになります。どうすればこの問題を回避できますか? – shajem

+0

「重複していますか?セルの高さを正しく設定していますか?どのようにCellの図面を実装していますか? –

0

はこれを試してみても、あなたはストアがデータを発注しない辞書にJSONからのデータを格納して再利用する細胞

- (void)requestSuccessfullyCompleted:(ASIHTTPRequest *)request{ 
       NSString *responseString = [request responseString]; 
       SBJsonParser *parser = [SBJsonParser new];    
       id content = [responseString JSONValue]; 
       if(!content){  
        return; 
       } 
       NSDictionary *personDictionary = content; 
       NSMutableArray *personMutableArray = [[NSMutableArray alloc] init]; 
       NSArray *array = [personDictionary allKeys]; 
       NSArray * sortedArray = [array sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; 

       for (NSString *str in sortedArray) 
       { 
        NSDictionary *childDictionary = [personDictionary objectForKey:str]; 
        Deal *deal = [[Deal alloc] init];    
        deal.name=[childDictionary objectForKey:@"name"]; 
        deal.dob=[childDictionary objectForKey:@"birthday"]; 
        [personMutableArray addObject:deal]; 
       }   
       self.personArray = [NSArray arrayWithArray:personMutableArray];  
    } 
0

のためのあなたのcellForRowAtIndexPath:を修正します。そのデータを配列内で順番に取得するか、配列を後でソートする必要があります。

あなたはこれを行うことができます名前のアルファベット順でソートしたい場合は、あなたが辞書データを格納した配列をソートできます。

self.personArray = [personMutableArray sortedArrayUsingSelector:@selector(compare:)]; 


- (NSComparisonResult)compare:(Deal *)dealObject { 
    return [self.name compare:dealObject.name]; 
} 

あなたはデータだけでJSONとして表現されるようにするには

for (int i = 1; i < [personDictionary.allValues count]; i++) 
{ 
    NSDictionary *childDictionary = [[personDictionary objectForKey:[NSString stringWithFormat:@"%d", i]]; 

    Deal *deal = [[Deal alloc] init];    
    deal.name=[childDictionary objectForKey:@"name"]; 
    deal.dob=[childDictionary objectForKey:@"birthday"]; 
    [personMutableArray addObject:deal]; 
}   
関連する問題