Domanda

Ho cercato più di metodo NSTableView di moveRowAtIndex:toIndex per l'animazione righe in una tabella. Non è davvero utile per l'ordinamento anche se da quello che posso dire. La mia interpretazione di come funziona è, se voglio spostare riga 0 a riga 4, quindi le righe tra vengano gestiti correttamente. Tuttavia, se ho una vista tabella con una serie appoggio, e poi I sorta matrice, voglio visualizzazione tabella di animare dal vecchio stato al nuovo stato. Non so quali elementi sono stati quelli che si muovevano contro quelli che passaggio per accogliere quelli spostati.

Esempio:

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

so che fila 0 spostato alla riga 3 quindi direi [tableView moveRowAtIndex:0 toIndex:3]. Ma se applico qualche operazione di ordinamento personalizzata su [A, B, C, D] per far sembrare [B, C, D, A], io in realtà non sanno che fila 0 spostato alla riga 3, piuttosto che le righe 1 , 2, e 3 trasferirsi a righe 0,1 e 2. i penserebbe che devo solo essere in grado di specificare tutti i movimenti (riga 0 spostato alla riga 4, riga 1 trasferisce alla riga 0, ecc), ma la l'animazione non sembra corretta quando provo questo.

C'è un modo migliore per fare questo?

Edit: ho trovato questo sito , che sembra fare quello che voglio, ma sembra un po 'troppo per qualcosa che dovrebbe essere semplice (almeno penso che dovrebbe essere semplice)

È stato utile?

Soluzione

La documentazione per moveRowAtIndex: toIndex:. Dice: "cambiamenti avvengono in modo incrementale in quanto vengono inviati alla tabella"

Il significato di 'incrementale' può essere meglio illustrato con la trasformazione da ABCDE a ECDAB.

Se si considera solo gli indici iniziale e finale, sembra che:

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

Tuttavia, quando si eseguono le modifiche in modo incrementale gli indici 'iniziale' possono saltare in giro come trasformare la matrice:

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)

In sostanza, è necessario dire al NSTableView, step-by-step, quali righe devono essere spostati al fine di giungere ad un allineamento identico al vostro array ordinato.

Ecco una semplice implementazione che accetta un array ordinato in modo arbitrario e 'replay' le mosse necessarie per trasformare la matrice originale nel array ordinato:

// '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];
}];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top