2015-02-25 7 views
20

UITableView Aktualisierungen zwischen beginUpdates und endUpdates Anrufe werden zusammengefasst und alle gleichzeitig ausgeführt. Apples Dokumentation ist spezifisch über die Reihenfolge, in der insert und delete Operationen durchgeführt werden:UITableView Löschen, Einfügen und Verschieben von Bestellungen in Stapelaktualisierungen

Löschen und Neuladen Operationen innerhalb eines Animationsblockes angeben, welche Zeilen und Abschnitte in der ursprünglichen Tabelle entfernt werden sollen oder neu geladen; Einfügungen legen fest, welche Zeilen und Abschnitte der resultierenden Tabelle hinzugefügt werden sollen. Die Indexpfade, die zum Identifizieren von Abschnitten und Zeilen verwendet werden, folgen diesem Modell. Das Einfügen oder Entfernen eines Elements in einem veränderbaren Array kann andererseits den Array-Index beeinflussen, der für den sukzessiven Einfügungs- oder Entfernungsvorgang verwendet wird; Wenn Sie beispielsweise ein Element in einen bestimmten Index einfügen, werden die Indizes aller nachfolgenden Elemente im Array inkrementiert.

Es ist auch erwähnenswert, dass:

Anrufe an beginUpdates und EndUpdates verschachtelt werden können; Alle Indizes werden wie behandelt, als ob es nur den äußeren Update-Block gäbe.

[Emphasis Mine]

Also: Man denke etwa Deletionen in einem ersten Durchlauf auftritt, und dann passiert irgendwelchen Einfügungen im Anschluss an diese, die neuen Index Pfade verwenden, die nach die Deletionen .

Das ist nützlich. Jedoch, Ich habe keine Dokumentation darüber gefunden, wo Zeilen- (und Abschnitts-) Bewegungen auftreten, welche Indexierung sie verwenden sollten und ob dies Auswirkungen auf die anderen Schritte hat. Weiß jemand?

+1

Ich versuche, TableView.move mit Batch-Löschungen und Einfügungen zu ersetzen, weil ich die Reihenfolge der Löschungen und Einfügungen kenne. Aber ohne Glück scheint Bewegung etwas anderes zu sein. Das hat mich dazu gebracht, mit Batch-Updates mit FetchedResultsController zu zögern, weil ich nicht weiß, was ich mit 'NSFetchedResultsChangeType.move' machen soll. Hast du Fortschritte? – jchnxu

+0

Keine weiteren Informationen, tut mir leid - Sie können es wahrscheinlich ausprobieren? – Benjohn

Antwort

3

Wenn Tabellenzeile zu bewegen, geben Sie zwei Indizes:

  • indexPath in ursprünglichen Tabelle, von wo aus dieser Zeile wird nehmen
  • newIndexPath in Tabelle resultierenden wo diese Zeile

    erscheinen

    func moveRow (bei indexPath: IndexPath, zu newIndexPath: IndexPath)

Mögliche widersprüchliche Vorgänge in einzelnen Charge, was app Absturz:

  • versucht, eine Zeile zu bewegen, auch Sie
  • versuchen, das Löschen derselben Zeile an mehrere Ziele
  • versuchen, sich zu bewegen mehrere Reihen zu bewegen das gleiche Ziel
  • versucht, eine Zeile zu dem gleichen Ziel zu bewegen, wo Sie neue Zeile einzufügen

Es ist nicht möglich, eine Zeile, die Sie einfügen, zu verschieben, da sie nicht in der Originaltabelle vorhanden war.

Standardmäßig wird die verschobene Zeile nicht aus der Datenquelle neu geladen.

+0

Hi Paiv, danke fürs Antworten! Ich habe diese Frage vor zwei Jahren gestellt und bin derzeit nicht in der Lage, Ihre Antwort zu validieren! ... Ich stelle fest, dass es eine offene Prämie gibt, die jemand anderes hinzugefügt hat - können Sie diese sammeln, wenn ich Ihre Lösung nicht korrekt markiert habe, vorausgesetzt, dass Sie sie Ihnen gewähren? – Benjohn

+0

Um zu verdeutlichen - ich denke, Sie sagen, dass wir Moves wie eine kombinierte löschen und einfügen können, was die Index-Pfad betrifft? Der "Lösch" -Teil der Verschiebeoperation tritt mit anderen Löschungen auf (und verwendet die anfängliche Indizierung). Der Einfügeteil der Verschiebeoperation erfolgt mit anderen Einfügungen (und verwendet die Post-Delete-Indexierung)? – Benjohn

+0

Dies scheint die verbleibende Frage zu hinterlassen, wie Inserts geordnet sind (und der Insert-Teil von Moves). Was passiert also, wenn mehr als eine Zeile in den gleichen Index eingefügt (oder verschoben) wird? Sie erwähnen, dass dies bei einer Bewegung zu einem Absturz führen würde. Wie fügt man zwei Zeilen am Anfang einer Tabelle ein, sagen wir? – Benjohn

Verwandte Themen