行を追加または削除するたびにテーブルビューを再ロードすると、アプリケーションのユーザーのエクスペリエンスが低下します。このタスクを実行するのは効率的な方法ではありませんが、いくつかのマイナスの副作用もあります。選択した行はリロード後に選択されたままにならず、変更はアニメーション化されません。
UITableView
テーブルビューのコンテンツを動的に変更するために作成されたメソッドがあります。これらは:
insertRowsAtIndexPaths:withRowAnimation:
moveRowAtIndexPath:toIndexPath:
deleteRowsAtIndexPaths:withRowAnimation:
これらのメソッドを使用すると、指定した操作の実行時に使用されるアニメーションの種類を指定できることに注意してくださいreloadData
。テーブルビューのコンテンツを変更するために使用する場合、この種類の動作を実現することはできません。
さらに、テーブルビューの追加のメソッドを使用して、複数のテーブルビュー操作を組み合わせることもできます(これは必須ではありません)。
beginUpdates endUpdates
実行する操作を呼び出しにラップするだけでbeginUpdates
、endUpdates
メソッドとテーブルビューは、呼び出しと呼び出しの間で要求されたすべての操作に対して1つのアニメーションを作成するため、遷移全体が、いくつかの別々のアニメーションによって作成されたものよりも見栄えが良くなります。beginUpdates
endUpdates
[self.tableView beginUpdates]
//calls to insert/move and delete methods
[self.tableView endUpdates]
データソースの状態を。によって保持されている状態と一致させることが非常に重要ですUITableView
。このため、テーブルビューが要求された操作の実行を開始すると、そのデータソースが正しい値を返すことを確認する必要があります。
[self.tableView beginUpdates]
//calls to insert/move and delete methods
//operations on our data source so that its
//state is consistent with state of the table view
[self.tableView endUpdates]
テーブルビューが操作の実行を開始するのはいつですか?beginUpdates
これは、操作がメソッドによって定義されたアニメーションブロック内にあるかどうかによって異なりendUpdates
ます。はいの場合、テーブルビューはendUpdates
メソッド呼び出し後に操作の実行を開始します。それ以外の場合、テーブルビューは、挿入/移動または削除メソッドの呼び出しが行われた直後に操作を実行します。
テーブルビューで操作を実行するメソッドを使用beginUpdates
しendUpdates
ている場合、この場合、テーブルビューは要求された操作を「バッチ処理」し、テーブルビューで行った呼び出しの順序と同じである必要はない特定の順序で実行することを知っておく必要があります。オブジェクト(このトピックに関するAppleのドキュメント)。
覚えておくべき最も重要なことは、すべての削除操作は常にすべての挿入操作の前に実行されるということです。また、挿入操作(インデックス1、2、3の操作)を昇順で実行すると、削除操作(インデックス3、2、1の操作)が降順で実行されるように見えます。これは、データソースの状態をテーブルビューで保持されている状態と一致させるために重要であることを忘れないでください。
以下の例に示すように、データソースとテーブルビューの操作の順序を分析するために時間を費やしてください。
最後の例:
//initial state of the data source
self.numbers = [@[@(0), @(1), @(2), @(3), @(4), @(5), @(6)] mutableCopy];
//
//...
//
NSArray indexPathsToRemove = @[[NSIndexPath indexPathForRow:3 section:0].
[NSIndexPath indexPathForRow:0 section:0];
NSArray indexPathsToAdd = @[[NSIndexPath indexPathForRow:6 section:0],
[NSIndexPath indexPathForRow:5 section:0]];
[self.tableView beginUpdates];
[self.numbers removeObjectAtIndex:3];
[self.numbers removeObjectAtIndex:0];
[self.numbers insertObject:@(10) atIndex:4];
[self.numbers insertObject:@(11) atIndex:5];
[self.tableView insertRowsAtIndexPaths:indexPathsToAdd withRowAnimation:UITableViewRowAnimationAutomatic];
[self.tableView deleteRowsAtIndexPaths:indexPathsToRemove withRowAnimation:UITableViewRowAnimationAutomatic];
[self.tableView endUpdates];
//final state of the data source ('numbers') - 1, 2, 4, 5, 6, 10, 11