Pregunta

He estado mirando por encima NSTableView's moveRowAtIndex:toIndex Método para animar filas en una tabla. Sin embargo, no es realmente útil para clasificar por lo que puedo decir. Mi interpretación de cómo funciona es, si quiero mover la fila 0 a la fila 4, entonces las filas intermedias se manejan adecuadamente. Sin embargo, si tengo una vista de tabla con una matriz que lo respalda, y luego ordeno la matriz, quiero que la vista de mesa anime desde el estado anterior al nuevo estado. No sé qué elementos fueron los que se movieron frente a los que cambian para acomodar a los movidos.

Ejemplo:

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

Sé que la fila 0 se movió a la fila 3, así que diría [tableView moveRowAtIndex:0 toIndex:3]. Pero si aplico una operación de clasificación personalizada a [A, B, C, D] para que se vea como [B, C, D, A], en realidad no sé que la fila 0 se moviera a la fila 3 en lugar de las filas 1 , 2 y 3 moviéndose a las filas 0,1 y 2. Creo que debería poder especificar todos los movimientos (fila 0 movido a la fila 4, fila 1 movida a la fila 0, etc.) pero el La animación no se ve correcta cuando lo intento.

¿Hay una mejor manera de hacer esto?

Editar: encontré este sitio, que parece hacer lo que quiero, pero parece un poco mucho por algo que debería ser simple (al menos creo que debería ser simple)

¿Fue útil?

Solución

La documentación para MoverowatIndex: Toindex: dice: "Los cambios ocurren de forma incremental a medida que se envían a la tabla".

La importancia de 'incrementalmente' se puede ilustrar mejor con la transformación de ABCDE a ECDAB.

Si solo considera los índices iniciales y finales, parece:

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

Sin embargo, al realizar los cambios incrementalmente, los índices 'iniciales' pueden saltar a medida que transforma su matriz:

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)

Básicamente, debe decirle al NstableView, paso a paso, qué filas deben moverse para llegar a una matriz idéntica a su matriz ordenada.

Aquí hay una implementación muy simple que toma una matriz ordenada arbitrariamente y 'reproduce' los movimientos requeridos para transformar la matriz original en la matriz ordenada:

// '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];
}];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top