UITableView beginUpdates endUpdates

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

  • UITableView beginUpdates endUpdates

    Hallo,

    habe mir einen TableView sample Code von apple gezogen. Dort habe ich gesehen, dass sie in ihrer add Methode, um einen neuen Eintrag zu machen, beginUpdates und endUpdates aufrufen.
    Wofür ist das sinnvoll, ist das nur für effekte relevant?!

    Ich habe es so gemacht, dass ich einen Eintrag in die DB schreibe, die DS aus der DB wieder Lese und die TableView neu befülle:
    [self loadData];
    [self.tableView reloadData];

    Das mache ich auch beim Löschen eines Eintrags so.

    Gruß
  • Hallo,

    Wofür ist das sinnvoll, ist das nur für effekte relevant?!

    Damit gibst Du dem Anwender ein schöneres Bedienerlebnis.

    Das mit Deinem einfachen -reloadData ist grundsätzlich richtig, aber es gibt keine Animation und die Tabelle verändert sich schlagartig.

    Mit dem -begin… und -end… teilst Du der Tabelle mit "hey, da geht was und pfusch nicht dazwischen".
    In diesem Teilbereich kannst Du Deinen Daten-Controller manipulieren und die Tabelle angleichen ohne das etwas kollidiert.

    Viele Grüße
  • Ist ja auch eine Frage wie groß die Tabelle ist und woher sie die Daten bekommt. Wenn ich eine Tabelle mit Daten aus dem Web lade und womöglich noch asynchron die Images dazu, dann will ich bestimmt nicht bei jedem Edit den Ganzen Gammel noch einmal laden müssen.

    reloadData ist halt der einfach Weg für faule Programmierer.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • In meinem Fall, habe ich eine Klasse, die von UITableViewController erbt.
    Wenn ich jetzt in der überschriebenen Methode "commitEditingStyle" etwas lösche muss ich das da noch einfügen?!
    Habe gemerkt, dass ich in dieser Methode im editing mode bin...
    Den wenn ich da beginUpdates einfüge, kriege ich eine Exception.
  • Thallius schrieb:

    Ist ja auch eine Frage wie groß die Tabelle ist und woher sie die Daten bekommt. Wenn ich eine Tabelle mit Daten aus dem Web lade und womöglich noch asynchron die Images dazu, dann will ich bestimmt nicht bei jedem Edit den Ganzen Gammel noch einmal…


    Stimmt schon, dass es der faule Weg ist.

    Aber wenn du Daten aus dem Internet lädst, wird deine View die Daten ja normal eh nicht selbst laden (MVC und so ;) ).

    Zusätzlich sollte ein ReloadData der UI auch nicht automatisch ein komplett neues Laden der Datenschicht auslösen.

    Und zu guter Letzt sollte man bei Bildern aus dem Netz sowieso cachen,
    sonst hast du das Problem auch wenn der User eine Cell aus dem Sichtbereich scrollt und wieder zurück.
  • eminwargo schrieb:

    In meinem Fall, habe ich eine Klasse, die von UITableViewController erbt.
    Wenn ich jetzt in der überschriebenen Methode "commitEditingStyle" etwas lösche muss ich das da noch einfügen?!
    Habe gemerkt, dass ich in dieser Methode im editing mode bin...
    Den wenn ich da beginUpdates einfüge, kriege ich eine Exception.


    Ich hatte das Gleiche Problem jetzt. Du must ein deleteRowsAtIndexPath aufrufen sonst bekommst du die Exception. Das scheint irgendwie neu zu sein. Früher meine ich ging es auch das man einfach reloadData aufruft. Alternativ kannst du auch ein loadRowsAtIndexPath von der Zelle aufrufen die im Edit Modus ist, dann hast du aber keine Animation.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Wie hier schon mehrfach gesagt: wenn Du die Tabelle mittels reloadData befüllst, brauchst Du keinen beginUpdates/endUpdates block - Du darfst relaodData nicht darin aufrufen. beginUpdates/endUpdates benutzt Du, wenn Du der Tabelle nur die Änderungen an einzelnen Sektionen/Zellen mitteilen möchtest. Hier die entsprechende Doku:

    developer.apple.com/library/io…c/uid/TP40006943-CH3-SW53

    Es kann aber u.U. sinnvoll sein, mit einen leeren beginUpdates/endUpdates Block der Tabelle mitzuteilen, dass sie das Layout animiert neu berechnen soll, z.B. wenn sich die Höhe in einer Zelle ändert. Das löst dann die entsprechenden -heightForRow... Methoden aus.
  • Thallius schrieb:


    Ich hatte das Gleiche Problem jetzt. Du must ein deleteRowsAtIndexPath aufrufen sonst bekommst du die Exception. Das scheint irgendwie neu zu sein. Früher meine ich ging es auch das man einfach reloadData aufruft. Alternativ kannst du auch ein loadRowsAtIndexPath von der Zelle aufrufen die im Edit Modus ist, dann hast du aber keine Animation.

    Gruß

    Claus


    Ok, aber muss ich das in den überschriebenen Methoden machen?

    Quellcode

    1. - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    2. BOOL editing = tableView.editing;
    3. [tableView beginUpdates];
    4. if (editingStyle == UITableViewCellEditingStyleDelete) {
    5. [self.controller deleteOne:[self.arrayData objectAtIndex:indexPath.row]];
    6. [self.arrayData removeObjectAtIndex:indexPath.row];
    7. [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    8. }
    9. [tableView endUpdates];
    10. [tableView reloadData];
    11. }
    Alles anzeigen


    Das editing ist true wenn ich eine Zelle lösche (brauche ich also evtl. kein beginUpdates?).
    Kriege jetzt eine Exception, dass das von der Anzahl nicht mehr passt?!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von eminwargo ()

  • Thyraz genau so sehe ich das auch. So ist es meiner Meinung nach auch korrekt.
    Aber nicht immer geht es um die perfekte Lösung, wenn etwas unter Zeitdruck getippselt werden muss.
    Deshalb verstehe ich auch Thallius.

    Das scheint irgendwie neu zu sein.

    Also ich meine, dass das schon immer so ist.
    Ich mache nur 10% iOS, aber ich bin "damals" vor zwei Jahren schon reingerannt.

    Viele Grüße