2016-07-26 26 views
7

私のUICollectionViewでは、カスタムオブジェクトの単純な配列を使用してセルを生成して表示します。時にはデータが変更され、変更を一度にアニメートしたいと思うことがあります。私は、2番目の配列のすべての変更を追跡し、2つを比較し、performBatchUpdatesブロック内に一連の移動、挿入、削除、および更新操作を生成することで、これを行うことにしました。インデックスを使った操作の順序について心配する必要があるので、これらのすべてを同じブロック内で行うのはかなり難しいことです。実際には、this issueの回答は間違っていますが、コメントで修正されています。UICollectionView performBatchUpdatesブロック内の移動、挿入、削除、および更新を順序付ける方法は?

ドキュメントはかなり欠けているようだが、それは一つのケースを取り上げます。

削除は、バッチ操作で挿入前に処理されています。これは、 を意味します。削除のインデックスは、バッチ処理前のコレクションビューの状態 のインデックスに対して処理され、挿入のインデックスは のインデックスに対して処理されます。バッチ処理のすべての削除後の状態。

しかし、このドキュメントでは、移動が処理されるときについては言及していません。私がmoveItemAtIndexPathdeleteItemsAtIndexPathsを同じperformBatchUpdatesと呼んだ場合、移動インデックスは削除前または削除後の順に相対的でなければなりませんか? insertItemsAtIndexPathsはどうですか?

最後に、私は同じ操作でreloadItemsAtIndexPathsmoveItemAtIndexPathを呼び出す問題に直面している:

致命的な例外を: を削除して、同じインデックスパス

をリロードするNSInternalInconsistencyExceptionの試みは、方法はあります私は同じですべての操作を行うにはperformBatchUpdates?もしそうなら、アップデートは他のアップデートと比べてどのような順序で処理されますか?そうでない場合、人々は通常何をしていますか?他のすべての操作を実行した後でデータをリロードしますか?前?私は、すべてのアニメーションが1つのステージで行われた方が好きです。

答えて

5

移動操作では、from indexPathは事前削除インデックスで、to indexPathは削除後インデックスです。再ロードは、挿入、削除、または移動されていないindexPathに対してのみ指定する必要があります。これはおそらく、NSInternalInconsistencyExceptionが表示されている理由です。

reload、insert、move-to-indexPathのセットには重複がなく、reload、delete、move-fromの各インデックスパスには何も設定しないでください重複します。

UPDATE:

あなたが移動するアイテムも更新、だけ移動されていないことが表示されます。したがって、アイテムを更新および移動する必要がある場合は、バッチ更新の前または後に(データソースの状態に応じて)再ロードを実行できます。

+0

だから、別の(たとえば異なる色)で表示されるため、更新が必要なセルがあり、移動する必要があるとします。これは私が移動してリロードする必要がある場所の例です。同じアニメーションブロックでこれらを実行する方法はありますか? –

+0

移動しているので、セルは自動的にリロードされます。明示的にリロードする必要はありません。 – Mark

+0

ああ!私は気づいていませんでした(そして私はこの事件を実験しなかったと思います)。コンテンツを再ロードせずにコンテンツコンテナを移動すると仮定しました。 –

関連する問題