2010-12-14 18 views
0

Ich habe überall nach diesem gesucht, aber ich bin nicht in der Lage, die genaue Antwort zu finden ... alle haben leichte Variationen.Nested NSArray in UITableView

Wie auch immer, ich nenne eine json Seite, die die folgenden (aus dem NSLog) liefert:

{ 
    messages =   { 
     1 =    { 
      Body = "This is the body of message 1"; 
      Title = "Message 1"; 
     }; 
     2 =    { 
      Body = "This is the body of message 2"; 
      Title = "Message 2"; 
     }; 
    }; 
} 

ich dann die Daten in ein NSDictionary speichern (genannt messageArray). (Das Array ein NSMutableArray)

dann tun i:

// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    //put rowsarray into dictionary 
    NSDictionary *dictionary = [messageArray objectAtIndex:indexPath.section]; 

    //new dictionary into array 
    NSArray *messages = [dictionary objectForKey:@"messages"]; 

    NSLog(@"the message array = %@",messages); 

    //this fails 
    cell.textLabel.text = [messages objectAtIndex:indexPath.row]; 

return cell; 

der zurück NSLog (so gehe davon aus ich meine Json-Array richtig funktioniert):

the message array = { 
1 =  { 
    Body = "This is the body of message 1"; 
    Title = "Message 1"; 
}; 
2 =  { 
    Body = "This is the body of message 2"; 
    Title = "Message 2"; 
}; 

}

Ich verstehe, dass ich den textlabels.text nicht richtig beschreibe, aber ich bin nicht sicher, wie man durch das "Nachrichten" -Array geht, um alle "Titel" -Werte vom Array anzuzeigen, um auf meiner UI angezeigt zu werden TableView-Liste.

ich bin mir sicher ich vermisse etwas so einfaches ... aber es ist mir bis jetzt entgangen. Alle Links gern gesehen ... ich werde mich immer wieder gesucht ....

Antwort

1
NSArray *messages = [dictionary objectForKey:@"messages"]; 

was die Notwendigkeit dieser Linie ist, wenn Sie Ihr Wörterbuch bekommen hier

NSDictionary *dictionary = [messageArray objectAtIndex:indexPath.section]; 

jetzt wissen Sie, was sind die Schlüssel für Daten-Wörterbuch zu befestigen.

dann einfach

cell.textLabel.text = [dictionary valueForKey:@"Title"]; 
cell.detailTextLabel.text= [dictionary valueForKey:@"Body"]; 
0

Dieser Aufruf

sieht aus wie es ist ein Wörterbuch der Rückkehr, und Sie versuchen, es in einem Testfeld zu stopfen. Ich würde bestätigen, dass dies ein Wörterbuch erste ist, so etwas wie:

NSLog(@"%@", [messages objectAtIndex:indexPath.row]) 

Wenn das kein String ist, die Ihr Problem sein kann.

Um die Zeichenfolge zu erhalten Sie wollen, vielleicht tun Sie so etwas wie:

[[messages objectAtIndex:indexPath.row] valueForKey:@"Title"] 
+0

Ich habe diese Zeile hinzugefügt: NSLog (@ "% @", [Nachrichten objectAtIndex: indexPath.row]) ;, und es gibt keine Liebe. Ich bekomme den nicht erkannten Selektor zur Instanz gesendet. – btwong

+0

versuchen, protokollieren [Nachrichten Klasse] – MCannon

0
cell.textLabel.text = [[messages objectAtIndex:indexPath.row] objectForKey:@"Title"]; 
cell.detailTextLabel.detailLabel = [[messages objectAtIndex:indexPath.row] objectForKey:@"Body"]; 
+0

Ich habe beide die Ideen der Einstellung der TextLabel ausprobiert, und ich bekomme nichts. Ich denke, ich muss auf mein Wörterbuch schauen und/oder eine Schnur erhalten. – btwong

+0

Was verwenden Sie, um das Json-Objekt in ein Wörterbuch zu konvertieren? – griotspeak

0

ich habe "semi" sortiert die Ausgabe. Ich habe die Indizes von den JSON-Daten entfernt, so jetzt sieht es so aus:

messages =  (
      { 
     Body = "This is the body of message 1"; 
     Title = "Message 1"; 
    }, 
      { 
     Body = "This is the body of message 2"; 
     Title = "Message 2"; 
    } 
); 

Und haben dies für die Besiedelung der Tabelle verwendet:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    //put rowsarray into dictionary 
    NSDictionary *dictionary = [messageArray objectAtIndex:indexPath.section]; 

    NSLog(@"dictionary = %@", dictionary); 

    //new dictionary into array 
    NSArray *messages = [dictionary objectForKey:@"messages"]; 

    //NSArray *message=[[messages allKeys] sortedArrayUsingSelector:@selector(compare:)]; 
    NSLog(@"array messages = %@", messages); 

    cell.textLabel.text = [[messages objectAtIndex:indexPath.row] objectForKey:@"Title"]; 

    return cell; 
} 

Ich hoffe, das jemand hilft.