Question

J'ai cherché sur la méthode de NSTableView de moveRowAtIndex:toIndex pour animer les lignes d'une table. Ce n'est pas vraiment utile pour le tri si ce que je peux dire. Mon interprétation de la façon dont cela fonctionne est, si je veux déplacer la ligne 0 à la ligne 4, puis les lignes entre sont gérées de façon appropriée. Cependant, si j'ai une vue de table avec un tableau sauvegarde, puis-je trier le tableau, je veux la vue de la table Animer de l'ancien état au nouvel état. Je ne sais pas quels éléments sont ceux qui se sont déplacés contre ceux qui déplacement pour s'adapter les déplacés.

Exemple:

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

Je sais que la ligne 0 déplacé à la ligne 3, donc je dirais [tableView moveRowAtIndex:0 toIndex:3]. Mais si je demande une opération de tri personnalisé à [A, B, C, D] pour la faire ressembler à [B, C, D, A], je ne sais pas en fait que la ligne 0 déplacé à la ligne 3 plutôt que les lignes 1 , 2 et 3 se déplaçant à des lignes 0,1 et 2. Je pense que je devrais être en mesure de préciser tous les mouvements (ligne 0 déplacé à la ligne 4, ligne 1 déplacé à la ligne 0, etc.), mais la l'animation ne semble pas correct quand j'essayer.

Y at-il une meilleure façon de le faire?

Edit: J'ai trouvé ce site , ce qui semble faire ce que je veux, mais semble un peu beaucoup pour quelque chose qui devrait être simple (au moins je pense qu'il devrait être simple)

Était-ce utile?

La solution

La documentation moveRowAtIndex: toIndex:. Dit: "Les changements se produisent progressivement car ils sont envoyés à la table"

La signification de « incrémentale » peut être mieux illustrée par la transformation de ABCDE à ECDAB.

Si l'on considère que les indices initiaux et finaux, il ressemble à:

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

Cependant, lorsque vous effectuez les changements progressivement les indices « initial » peuvent sauter autour comme vous transformez votre tableau:

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)

En gros, vous devez dire au NSTableView, étape par étape, les lignes doivent être déplacées afin d'arriver à un tableau identique à votre tableau trié.

Voici une implémentation très simple qui prend un tableau trié arbitraire et « rejoue » les mouvements nécessaires pour transformer le tableau original dans le tableau trié:

// '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];
}];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top