Анимирование NSTABLEVIEW с началом и окончанием штатов массива
-
25-10-2019 - |
Вопрос
Я просматривал NSTableView
S. 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];
}];