アレイの開始と終了の状態でnStableViewをアニメーション化します
-
25-10-2019 - |
質問
私は見渡してきました NSTableView
's moveRowAtIndex:toIndex
テーブル内の行をアニメーション化する方法。私が伝えることができることから、ソートにはあまり役に立ちません。それがどのように機能するかについての私の解釈は、行0に4行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が行1ではなく行3に移動したことは実際にはわかりません。 、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)
基本的に、ソートされたアレイと同じ配列に到達するには、段階的な段階的な段階的な段階で伝える必要があります。
これは、任意にソートされた配列を取得し、元の配列をソートされた配列に変換するために必要な動きを「リプレイ」する非常に簡単な実装です。
// '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];
}];