20 個のセルがUITableView
あり、最初のセルを表示し、バックグラウンドでさらにデータをロードします。データがロードされた後、元の 20 個のセルの前に 10 個のセルを挿入します。UITableView
元の最初のセルを表示したままにしたい(他の手段は、挿入後に11番セルを表示する)。次のコードを使用します。
// before insert 10 item, the UITableView(_contentTable) has 20 cell and displaying the first cell
// newItems is an NSArray has 10 item.
// insert 10 data to the data source (_contents)
if ( [newItems count] )
{
for ( NSUInteger i = [newItems count]; i > 0; --i )
{
[_contents insertObject:[newItems objectAtIndex:i - 1] atIndex:0];
}
}
// make the indexPaths for insertRowsAtIndexPaths
NSMutableArray *indexPaths = [[NSMutableArray alloc] initWithCapacity:newItems.count];
for (NSUInteger i = 0; i<newItems.count; ++i) {
[indexPaths addObject:[NSIndexPath indexPathForRow:i inSection:0]];
}
[_contentTable beginUpdates];
// insert cell
[_contentTable insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
// scrall to number 10 cell, make the UITableView looks like nothing happen on the background
NSIndexPath *path = [NSIndexPath indexPathForRow:10 inSection:0];
[_contentTable scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionTop animated:NO];
[_contentTable endUpdates];
そのコードの問題は、テーブルが上にスクロールすることです(おそらく原因insertRowsAtIndexPaths
、パラメータを使用しましたUITableViewRowAnimationNone
が、テーブルはまだスクロールします)および下(おそらく原因scrollToRowAtIndexPath
)2回。