Frage

Ich habe übergesehen NSTableView's moveRowAtIndex:toIndex Methode zum Animieren von Zeilen in einer Tabelle. Es ist nicht wirklich hilfreich, um nach dem zu sortieren, was ich sagen kann. Meine Interpretation, wie es funktioniert, ist, wenn ich Zeile 0 in Reihe 4 verschieben möchte, dann werden die Zeilen dazwischen angemessen behandelt. Wenn ich jedoch eine Tabellenansicht mit einem Array -Sicherung habe und dann das Array sortiere, möchte ich, dass die Tabelleansicht vom alten Staat in den neuen Staat animiert wird. Ich weiß nicht, welche Gegenstände diejenigen waren, die gegen diejenigen umgezogen sind, die sich verschieben, um die bewegten zu unterbringen.

Beispiel:

[A,B,C,D] --> [B,C,D,A]

Ich weiß, dass Zeile 0 in Reihe 3 bewegt wurde, also würde ich sagen [tableView moveRowAtIndex:0 toIndex:3]. Wenn ich jedoch eine benutzerdefinierte Sortieroperation auf [A, B, C, D] anwende, um es wie [B, C, D, A] aussehen zu , 2 und 3, die zu Zeilen 0,1 und 2. Ich würde denken, dass ich einfach alle Bewegungen angeben sollte Die Animation sieht nicht korrekt aus, wenn ich das versuche.

Gibt es einen besseren Weg, dies zu tun?

EDIT: Ich habe gefunden Diese Seite, was zu tun scheint, was ich will, aber ein bisschen viel für etwas, das einfach sein sollte (zumindest denke ich, dass es einfach sein sollte)

War es hilfreich?

Lösung

Die Dokumentation für MoverowatIndex: TOINDEX: "Änderungen erfolgen schrittweise, wenn sie an die Tabelle gesendet werden".

Die Bedeutung von "inkrementell" kann am besten mit der Transformation von ABCDE zu ECDAB illustriert werden.

Wenn Sie nur die ersten und endgültigen Indizes berücksichtigen, sieht es aus wie:

E: 4->0
C: 2->1
D: 3->2
A: 0->3
B: 1->4

Wenn Sie jedoch die Änderungen inkrementell durchführen, können die "Anfangs" -Indexes jedoch herumspringen, wenn Sie Ihr Array transformieren:

E: 4->0 (array is now EABCD)
C: 3->1 (array is now ECABD)
D: 4->2 (array is now ECDAB)
A: 3->3 (array unchanged)
B: 4->4 (array unchanged)

Grundsätzlich müssen Sie die NStableView von Schritt für Schritt mitteilen, die Zeilen bewegt werden müssen, um zu einem Array zu gelangen, das mit Ihrem sortierten Array identisch ist.

Hier ist eine sehr einfache Implementierung, die ein willkürlich sortiertes Array und die "Wiederholungen" der Bewegungen erfordert, die erforderlich sind, um das ursprüngliche Array in das sortierte Array zu verwandeln:

// 'backing' is an NSMutableArray used by your data-source
NSArray* sorted = [backing sortedHowYouIntend];

[sorted enumerateObjectsUsingBlock:^(id obj, NSUInteger insertionPoint, BOOL *stop) {

  NSUInteger deletionPoint = [backing indexOfObject:obj];

  // Don't bother if there's no actual move taking place
  if (insertionPoint == deletionPoint) return;

  // 'replay' this particular move on our backing array
  [backing removeObjectAtIndex:deletionPoint];
  [backing insertObject:obj atIndex:insertionPoint];

  // Now we tell the tableview to move the row
  [tableView moveRowAtIndex:deletionPoint toIndex:insertionPoint];
}];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top