2016-07-25 24 views
1

Wie berechnet man die Anzahl der Zeilen für jeden Abschnitt und füllt seine Daten. Unten sind die Daten.Dynamische Zeilen für jeden Abschnitt

<__NSCFArray 0x7fadb3e73a60>(
    { 
     AMID = ""; 
     AMName = "xyz"; 
     records =  (
        { 
       EId = 100; 
       EMName = "abc"; 
       EName = "Ename1"; 
      } 
     ); 
     EGroupId = 001; 
     EGroupName = "SectionName1"; 
     stat = G; 
    }, 

    { 
     AMID = ""; 
     AMName = "zyx"; 
     records =  (
        { 
       EId = 144; 
       EMName = "namename"; 
       EName = "somestring"; 
      }, 
        { 
       EId = 159; 
       EMName = "somestring"; 
       EName = "somestring"; 
      }, 
        { 
       EId = 161; 
       EMName = "somestring"; 
       EName = "somestring"; 
      } 

    ); 
      EGroupId = 86; 
      EGroupName = "SectionName2"; 
      stat = Y; 
     } 
) 

Aus den obigen Daten, i den „EGroupName“ Wert in den Abschnitten wollen und dynamisch die numberOfRowsInSection für jeden Abschnitt zählen (in diesem Fall ist es SectionName1 und SectionName2). Schluss Ausgabe sollte wie,

**SectionName1** 
    return 1; 
**SectionName2** 
    return 3; 

wirklich Ihre Hilfe zu schätzen wissen.

Edited

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    NSString *selectedEngagementGroupId = engagementGroupDataArray[indexPath.section][@"EngagementGroupId"]; 
    NSString *selectedEngagementId = modelItem[@"EId"]; 
    NSLog(@"EGId %@",selectedEngagementGroupId); 
    NSLog(@"EId %@",selectedEngagementId); 

} 

Antwort

2

Das Array, einmal in Objekte umgewandelt werden eine Reihe von Wörterbüchern sein, wobei jedes Wörterbuch ein Array enthält, und jede enthält einen String-Wert, kann als Abschnittsname verwendet werden. Das ist eine perfekte Datenquelle für eine Tabellenansicht mit mehreren Abschnitten.

Nach dem JSON Parsen, erhalten Sie eine objektive c Sammlung haben, rufen sie:

NSArray *parsedObject; 

Die Anzahl der Abschnitte ist:

parsedObject.count; 

Der Titel eines Abschnitts in einem indexPath ist :

parsedObject[indexPath.section][@"EGroupName"] 

Die Anzahl der Zeilen in einem Schnitt ist:

NSArray *sectionArray = parsedObject[section][@"records"]; 
[sectionArray count] 

Das Modell Artikel zu einem bestimmten indexPath ist:

NSArray *sectionArray = parsedObject[indexPath.section][@"records"]; 
sectionArray[indexPath.row]; 

EDIT ein wenig tiefer zu gehen, der Abschnitt Array selbst ist ein Array von Wörterbüchern, also ...

NSArray *sectionArray = parsedObject[indexPath.section][@"records"]; 
NSDictionary *modelItem = sectionArray[indexPath.row]; 

NSNumber *itemId = modelItem[@"EId"]; 
NSNumber *itemEMName = modelItem[@"EMName"]; 
NSNumber *itemName = modelItem[@"EName"]; 

// if the table cell is a just a vanilla UITableViewCell... 
cell.textLabel.text = itemName; 
cell.detailTextLabel.text = itemEMName; 

BEARBEITEN SIE WIEDER Denken Sie daran, dass Ihr gesamter Datenquellcode diesem Muster folgen muss, um Attribute auf Abschnittsebene aus den Daten zu erhalten ...

NSString *engagementGroupString = engagementGroupDataArray[section][@"EGroupName"]; 
NSString *engagementManagerString = engagementGroupDataArray[section][@"AMName"]; 

EDIT wieder, wieder Sie finden es vielleicht ermüdend all das Zeug tippen das Modell Artikel jedes Mal bekommen sie gebraucht wird. Wenn ja, können Sie die Dinge komprimieren, indem eine Hilfsfunktion wie das Erstellen:

- (NSDictionary *)modelItemForIndexPath:(NSIndexPath *):indexPath { 
    NSArray *sectionArray = parsedObject[indexPath.section][@"records"]; 
    return sectionArray[indexPath.row]; 
} 

Nun, zum Beispiel, wenn der Benutzer etwas auswählt:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSString *selectedEngagementGroupId = engagementGroupDataArray[indexPath.section][@"EngagementGroupId"]; 
    NSDictionary *modelItem = [self modelItemForIndexPath:indexPath]; 
    NSString *selectedEngagementId = modelItem[@"EId"]; 
    NSLog(@"EGId %@",selectedEngagementGroupId); 
    NSLog(@"EId %@",selectedEngagementId); 
} 
+0

Ich bekomme die richtige Anzahl von Zeilen für jeden Abschnitt. Wie zeigt man "EName" als Titel und "EMName" wie für jede Zeile an? – user3310076

+0

@ user3310076 - Aus den Daten im OP geht hervor, dass das records-Array ein Array von Dictionaries ist. – danh

+0

App stürzt beim Scrollen der Tabelle ab. Beenden der App aufgrund der nicht abgefangenen Ausnahme 'NSRangeException', Grund: '- [__ NSCFArray objectAtIndex:]: index (11) über Grenzen hinaus (11). Ich poste meinen Code in der Antwortbox. Bitte lass mich wissen, was ich falsch mache. – user3310076

1

Ich nehme an, Sie wissen, wie zu konvertieren, dass JSON in eine Objective-C Sammlung (Sie ein Top-Level-Array-Objekt erhalten werden ich denke , aber nicht zeigen das Top-Level-Objekt, das nicht gültig ist JSON).

Sie müssen eine NSMutableDictionary-Eigenschaft erstellen, um Ihre Daten zu speichern, und der Schlüssel ist der Abschnittsname und die Werte sind das zugehörige Array records.

@property NSMutableDictionary *_sections; 

jedoch eine Komplikation ist, dass Wörterbücher nicht pflegen um und Ordnung ist sehr wichtig, mit UITableView, so dass Sie die Reihenfolge, in einem separaten Array zu halten brauchen:

@property NSMutableArray *_sectionNames; 

Ordnen Sie sie in das Bit des Codes, das die JSON entschlüsseln und dann Daten in ihnen wie folgt speichern:

Wenn Sie die Abschnitte sortieren möchten alphabetisch zum Beispiel, dann sortieren Sie einfach _sectionNames, wie Sie möchten (Übung für den Leser).

Und dann die UITableDataSource Methoden wird so etwas sein:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return [_sectionNames count]; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    NSString *sectioName = _sectionNames[section]; 
    return [_sections[sectionName] count]; 
} 
+0

Dank. Allerdings bekomme ich "keine sichtbaren @ Schnittstelle für nsmutabledictionary deklariert die Selector addObject" -Fehler. und ich habe die tatsächlichen Daten aktualisiert, die vom Webservice empfangen werden – user3310076

+0

@danh Danke; korrigiert. – Droppy

+0

@ user3310076 Ich hatte den falschen Methodennamen. – Droppy