2

テーブル内の行をアニメーション化するためNSTableViewの のメソッドを調べてきました。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が行1ではなく行3に移動したことが実際にはわかりません、2、および 3 が行 0、1、および 2 に移動します。すべての動き (行 0 が行 4 に移動、行 1 が行 0 に移動、など) を指定できるはずだと思いますが、試してみると、アニメーションが正しく見えません。

これを行うより良い方法はありますか?

編集:私はこのサイトを見つけました。これは私がやりたいことをしているように見えますが、単純であるべきものには少し多すぎるようです(少なくとも単純であるべきだと思います)

4

1 に答える 1

6

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];
}];
于 2011-11-30T09:10:32.760 に答える