Анимирование NSTABLEVIEW с началом и окончанием штатов массива

StackOverflow https://stackoverflow.com/questions/8319332

Вопрос

Я просматривал NSTableViewS. moveRowAtIndex:toIndex Метод для анимирования рядов в таблице. Это не очень полезно для сортировки, хотя из того, что я могу сказать. Моя интерпретация того, как это работает, если я хочу переместить строку 0 в строку 4, то ряды между ними обрабатываются надлежащим образом. Однако, если у меня есть представление о таблице с подкреплением массива, а затем я сортирую массив, я хочу, чтобы представление о таблице анимировалось от старого штата в новое состояние. Я не знаю, какие предметы были те, которые двигались по сравнению с теми, которые сдвигаются, чтобы приспособиться к перемещенным.

Пример:

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

Я знаю, что строка 0 перенесла в строку 3, поэтому я бы сказал [tableView moveRowAtIndex:0 toIndex:3]. Анкет Но если я применяю какую -то пользовательскую операцию сортировки к [A, B, C, D], чтобы она выглядела как [B, C, D, A], я на самом деле не знаю, что строка 0 перенесена в строку 3, а не в ряды 1 , 2 и 3, перемещающиеся к рядам 0,1, и 2. Я думаю, что я должен быть в состоянии указать все движения (строка 0 перенесена в строку 4, строка 1 перенесена в строку 0 и т. Д.), Но в Анимация не выглядит правильно, когда я попробую.

Есть лучший способ сделать это?

РЕДАКТИРОВАТЬ: Я нашел этот сайт, что, кажется, делает то, что я хочу, но кажется немного большим для чего -то, что должно быть просто (по крайней мере, я думаю, что это должно быть просто)

Это было полезно?

Решение

Документация для Moverowatindex: Toindex: говорит: «Изменения происходят постепенно, когда они отправляются в таблицу».

Значение «постепенного» может быть лучше всего проиллюстрировано с преобразованием от ABCDE в ECDAB.

Если вы просто рассмотрите начальные и окончательные индексы, это похоже на:

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

Однако при постепенном выполнении изменений индексы «начальные» могут прыгать вокруг при преобразовании своего массива:

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)

По сути, вам нужно сообщить NstableView, пошаговый, который нужно перемещать строки, чтобы прийти к массиву, идентичному вашему отсортированному массиву.

Вот очень простая реализация, которая принимает произвольно отсортированный массив и «повторяет» движения, необходимые для преобразования исходного массива в сортированный массив:

// '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];
}];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top