Viele Sections in UITableView

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Viele Sections in UITableView

    Moin,

    ich brauche einen Lösungsvorschlag.
    Ich habe für einen Kumpel eine App geschrieben, welche es seinen Webshop-Kunden ermöglich, Ihre Bestellungen und deren Stati einzusehen. Die Daten ziehe ich als JSON und packe sie in ein Dictionary.

    Jede Bestellung kann 21 verschiedene Stati haben. Ich habe es bis jetzt so, dass die Bestellungen untereinander, die Neueste zuerst, angezeigt werden. Titel ist Bestellnummer, Subtitel ist der Status.

    Jetzt hab ich mir überlegt, für jeden Status eine Section anzulegen, damit es übersichtlicher wird.
    Kann ich das Dictionary irgendwie in einer Schleife mit Predicate filtern und so die Sections "verarbeiten" oder muss ich dafür 21 Arrays anlegen?
    Wie gehe ich am besten vor?

    Gruß
    Bernd
    Ich bin gegen Signaturen!!!
  • Naja, im Prinzip total einfach. Du erstellst Dir einfach eine Klasse Produkt oder so und die enthält alle Daten eines Produktes. Die packst du dann in ein Array und schon kannst du damit alles machen was du lustig bist.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • macmoonshine schrieb:

    beage schrieb:

    Kann ich das Dictionary irgendwie in einer Schleife mit Predicate filtern und so die Sections "verarbeiten" oder muss ich dafür 21 Arrays anlegen?

    Du kannst sowohl Schleifen, Prädikate und auch KVC verwenden. Wie Du das am sinnvollsten einsetzt, hängt jedoch von Deinen konkreten Strukturen ab.


    Die Daten kommen so an. Dies wären also 2 Sections. Eine mit einem und eine mit 3 Einträgen.

    Quellcode

    1. [
    2. {"customers_id":"80","orders_id":"376","date_purchased":"2013-10-15 01:44:46","orders_status":"2"},
    3. {"customers_id":"80","orders_id":"375","date_purchased":"2013-10-15 01:27:20","orders_status":"1"},
    4. {"customers_id":"80","orders_id":"368","date_purchased":"2013-10-14 20:32:55","orders_status":"1"},
    5. {"customers_id":"80","orders_id":"367","date_purchased":"2013-10-14 20:16:41","orders_status":"1"}
    6. ]


    Nach dem Import siehts dann so aus:

    Quellcode

    1. 2013-10-15 10:37:52.545 druckfabrik[10760:a0b] (
    2. {
    3. "customers_id" = 80;
    4. "date_purchased" = "2013-10-15 01:44:46";
    5. "orders_id" = 376;
    6. "orders_status" = 2;
    7. },
    8. {
    9. "customers_id" = 80;
    10. "date_purchased" = "2013-10-15 01:27:20";
    11. "orders_id" = 375;
    12. "orders_status" = 1;
    13. },
    14. {
    15. "customers_id" = 80;
    16. "date_purchased" = "2013-10-14 20:32:55";
    17. "orders_id" = 368;
    18. "orders_status" = 1;
    19. },
    20. {
    21. "customers_id" = 80;
    22. "date_purchased" = "2013-10-14 20:16:41";
    23. "orders_id" = 367;
    24. "orders_status" = 1;
    25. }
    26. )
    Alles anzeigen
    Ich bin gegen Signaturen!!!
  • Die enthaltenen Abschnitte kannst Du über KVC ermitteln:

    Quellcode

    1. NSArray *theArray = ...;
    2. NSArray *theSectionIds = [theArray valueForKeyPath:@"@distinctUnionOfObjects.orders_status"];

    Die Einträge in den Abschnitten kannst Du dann jeweils über ein entsprechendes Prädikat (@"order_status = %@") filtern.
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Die enthaltenen Abschnitte kannst Du über KVC ermitteln:

    Quellcode

    1. NSArray *theArray = ...;
    2. NSArray *theSectionIds = [theArray valueForKeyPath:@"@distinctUnionOfObjects.orders_status"];

    Die Einträge in den Abschnitten kannst Du dann jeweils über ein entsprechendes Prädikat (@"order_status = %@") filtern.


    Geil, das probier ich gleich mal! Danke!
    Ich bin gegen Signaturen!!!
  • Ich hab's jetzt sweit, dass er mir das Array schön "zusammenbastelt".

    Allerdings hab ich die Sections, also den orders_status nicht als Key vorliegen. Wie mach ich das?


    Quellcode

    1. NSMutableArray *gefiltert_arr = [[NSMutableArray alloc] init];
    2. int i;
    3. for (i=0; i < sections_arr.count; i++) {
    4. NSLog(@"%@",sections_arr[i]);
    5. NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"(orders_status = %@)", sections_arr[i]];
    6. [gefiltert_arr addObject: [NSMutableArray arrayWithArray:[self.bestellungen_arr filteredArrayUsingPredicate:resultPredicate]]];
    7. }


    Ausgabe:

    Quellcode

    1. 2013-10-15 12:55:41.277 druckfabrik[11164:a0b] (
    2. (
    3. {
    4. "customers_id" = 80;
    5. "date_purchased" = "2013-10-15 01:27:20";
    6. "orders_id" = 375;
    7. "orders_status" = 1;
    8. },
    9. {
    10. "customers_id" = 80;
    11. "date_purchased" = "2013-10-14 20:32:55";
    12. "orders_id" = 368;
    13. "orders_status" = 1;
    14. },
    15. {
    16. "customers_id" = 80;
    17. "date_purchased" = "2013-10-14 20:16:41";
    18. "orders_id" = 367;
    19. "orders_status" = 1;
    20. }
    21. ),
    22. (
    23. {
    24. "customers_id" = 80;
    25. "date_purchased" = "2013-10-15 01:44:46";
    26. "orders_id" = 376;
    27. "orders_status" = 2;
    28. }
    29. )
    30. )
    Alles anzeigen
    Ich bin gegen Signaturen!!!
  • Wozu brauchst du den key denn? Du kannst jetzt die Anzahl der Sections mit gefiltert_arr.count abfragen und in rawForIndexPath nimmst du gefiltert_arr[index.section][index.path]

    In titleForSection nimmst du halt immer den ersten Eintrag also gefiltert_arr[index.section][0];

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Thallius schrieb:

    Wozu brauchst du den key denn? Du kannst jetzt die Anzahl der Sections mit gefiltert_arr.count abfragen und in rawForIndexPath nimmst du gefiltert_arr[index.section][index.path]

    In titleForSection nimmst du halt immer den ersten Eintrag also gefiltert_arr[index.section][0];

    Gruß

    Claus


    Jetzt komme ich aber nicht mehr mit

    Quellcode

    1. switch ([[bestellungen_dic objectForKey:@"orders_status"] integerValue]) { ...}


    an den Status, weil der ja eine Ebene tiefert liegt, oder?

    Ich galub, ich hab mich jetzt richtig verstrickt :(
    Ich bin gegen Signaturen!!!
  • Deswegen war mein Vorschlag es erstmal in Objekte aufzubröseln und dann damit zu arbeiten. Für mich ist das auch immer viel leichter zu verstehen als diese blöden verschachtelten Dictionaries, am besten noch Arrays und Ditcs ineinander so wie du es jetzt hast. Für mich ist das immer sehr schwer bildlich zu erfassen und zu verarbeiten.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Thallius schrieb:

    wofür brauchst du denn den Switch überhaupt?


    Mit dem switch setz ich den die Werte für den TableHeader, also die Benennung der einzelenen Stati

    Quellcode

    1. NSString *status;
    2. switch ([[bestellungen_dic objectForKey:@"orders_status"] integerValue]) {
    3. case 1: status = @"Offen"; break;
    4. case 2: status = @"In Bearbeitung"; break;
    5. case 3: status = @"Versendet"; break;
    6. case 4: status = @"Zahlung per Paypal erhalten"; break;
    7. case 5: status = @"Nicht bezahlt / Warten auf Daten"; break;
    8. case 6: status = @"Bezahlt / Warten auf Daten"; break;
    9. case 7: status = @"Korrekturabzug versendet"; break;
    10. case 8: status = @"Nicht bezahlt / Daten eingeg."; break;
    11. case 9: status = @"Bezahlt / Daten eingeg."; break;
    12. case 10: status = @"Ware zur Abholung bereit"; break;
    13. case 11: status = @"PayPal Abbruch"; break;
    14. case 12: status = @"Offen PP bezahlt"; break;
    15. case 13: status = @"Offen PP wartend"; break;
    16. case 14: status = @"PayPal abgelehnt"; break;
    17. case 15: status = @"Bezahlung schwebend"; break;
    18. case 16: status = @"Bezahlung erfolgt"; break;
    19. case 17: status = @"Bezahlung storniert"; break;
    20. case 18: status = @"Prüfung notwendig"; break;
    21. case 19: status = @"Unbestätigt"; break;
    22. case 20: status = @"Bestätigt"; break;
    23. case 21: status = @"Bezahlt"; break;
    24. default: status = @"unbekannt"; break;
    25. }
    Alles anzeigen
    Ich bin gegen Signaturen!!!
  • Ich muss auch so irgendwie an die Keys rankommen, weil ich aus der View ja dann noch weitergehe in die einzelnen Bestellungen. Die App ist ja eigentlich fertig, bis auf die Sections halt.

    Quellcode

    1. - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    2. {
    3. NSIndexPath *selectedRowIndex = [self.tableView indexPathForSelectedRow];
    4. if(selectedRowIndex) {
    5. EinzelBestellungViewController *EinzelBestellungViewController = [segue destinationViewController];
    6. id myValue = [self.bestellungen_arr objectAtIndex:selectedRowIndex.row];
    7. EinzelBestellungViewController.order_id = [myValue objectForKey:@"orders_id"];
    8. }
    9. }
    Ich bin gegen Signaturen!!!
  • Ich verstehe es immer noch nicht.

    Im titleForSection (und nur da brauchst du ja dann deinen Switch, wobei ich den Swich eh scheiße finde ein Array mit BEzeichnern wäre da deutlich übersichtlicher und performater) bekommst du die Section. Wenn du da dann aus dem Array einfach mit entry= gefiltert_arr[section][0] den ersten eintrag holst, dann kannst du aus dem mit valueForKey('status') den Status holen und mit diesem den Switch bedienen.

    Wo ist denn jetzt das Problem?

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Thallius schrieb:

    Ich verstehe es immer noch nicht.

    Im titleForSection (und nur da brauchst du ja dann deinen Switch, wobei ich den Swich eh scheiße finde ein Array mit BEzeichnern wäre da deutlich übersichtlicher und performater) bekommst du die Section. Wenn du da dann aus dem Array einfach mit entry= gefiltert_arr[section][0] den ersten eintrag holst, dann kannst du aus dem mit valueForKey('status') den Status holen und mit diesem den Switch bedienen.

    Wo ist denn jetzt das Problem?

    Gruß

    Claus


    Das Problem ist, dass ich genau wie Du meiner, ich Deiner Denkweise nicht folgen kann. Ich schnalls einfach nicht, wie Du das meinst.
    So ist der aktuelle Stand jetzt. Ich hab

    Quellcode

    1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    2. {
    3. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BestellungenCell"];
    4. bestellungen_dic = [gefiltert_arr objectAtIndex:indexPath.section]; // Hier weiss ich nicht, wie es das machen soll. Das indexPath.row muss ja noch mit rein, Aber wie und wo?
    5. NSLog(@"%@",bestellungen_dic);
    6. ...
    7. NSString *status;
    8. switch ([[bestellungen_dic objectForKey:@"orders_status"] integerValue]) {
    9. case 1: status = @"Offen"; break;
    10. case 2: status = @"In Bearbeitung"; break;
    11. case 3: status = @"Versendet"; break;
    12. case 4: status = @"Zahlung per Paypal erhalten"; break;
    13. case 5: status = @"Nicht bezahlt / Warten auf Daten"; break;
    14. case 6: status = @"Bezahlt / Warten auf Daten"; break;
    15. case 7: status = @"Korrekturabzug versendet"; break;
    16. case 8: status = @"Nicht bezahlt / Daten eingeg."; break;
    17. case 9: status = @"Bezahlt / Daten eingeg."; break;
    18. case 10: status = @"Ware zur Abholung bereit"; break;
    19. case 11: status = @"PayPal Abbruch"; break;
    20. case 12: status = @"Offen PP bezahlt"; break;
    21. case 13: status = @"Offen PP wartend"; break;
    22. case 14: status = @"PayPal abgelehnt"; break;
    23. case 15: status = @"Bezahlung schwebend"; break;
    24. case 16: status = @"Bezahlung erfolgt"; break;
    25. case 17: status = @"Bezahlung storniert"; break;
    26. case 18: status = @"Prüfung notwendig"; break;
    27. case 19: status = @"Unbestätigt"; break;
    28. case 20: status = @"Bestätigt"; break;
    29. case 21: status = @"Bezahlt"; break;
    30. default: status = @"unbekannt"; break;
    31. }
    32. cell.textLabel.text = [bestellungen_dic objectForKey:@"orders_id"]; // Hier schmiert er natürlich ab, weil er die Key inder 2. Ebene nicht findet. Das ist mein Problem
    33. cell.detailTextLabel.text = [NSString stringWithFormat:@"Status: %@", status];
    34. return cell;
    35. }
    Alles anzeigen
    Ich bin gegen Signaturen!!!