web-dev-qa-db-ja.com

1つのUITableViewセル/行だけをリロードしてアニメーション化する方法は?

1つのセル/行だけをリロードしてアニメーション化するにはどうすればよいですか?現在、いくつかのファイルをダウンロードしています。ファイルのダウンロードが終了するたびに、デリゲートが終了したことを呼び出し、[tableview reload]を呼び出します。しかし、その後、テーブル全体がリロードされます。そして、どのようにテーブルをアニメーション化して、点滅しないようにすることができますか。たとえば、フェード効果など。

あいさつ

68
madmax

次のUITableViewインスタンスメソッドを使用します。

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation

リロードするNSArrayNSIndexPathsを指定する必要があります。リロードしたいだけの場合。 1つのセルのみをリロードする場合は、NSArrayを1つだけ保持するNSIndexPathを指定できます。例えば:

NSIndexPath* rowToReload = [NSIndexPath indexPathForRow:3 inSection:0];
NSArray* rowsToReload = [NSArray arrayWithObjects:rowToReload, nil];
[myUITableView reloadRowsAtIndexPaths:rowsToReload withRowAnimation:UITableViewRowAnimationNone];

行の更新をアニメーション化するすべての可能な方法について、UITableViewRowAnimation enumを見ることができます。アニメーションが不要な場合は、例のように値UITableViewRowAnimationNoneを使用できます。

特定の行をリロードすることには、単に目的のアニメーション効果を得るよりも大きな利点があります。また、本当に再ロードする必要があるセルのみがデータを更新、再配置、再描画されるため、パフォーマンスが大幅に向上します。セルの複雑さによっては、セルを更新するたびにかなりのオーバーヘッドが発生する可能性があるため、実行する更新量を絞り込むことは、可能な限り使用する必要がある最適化です。

184
James Bedford

Tableviewセルのテキストを更新するだけの場合。

UITableViewCell *cell = [_myTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:1]];

cell.textLabel.text = [NSString stringWithFormat:@"%i", (int)_targetMaxDistanceSlider.value];
3
slammer

Apple Document 新しい構文で完了

[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
1

指定されたtableViewindexPathsの特定のセルをリロードするには、indexPathsarrayを作成し、reloadRowsAtIndexPathsで関数tableViewを呼び出す必要があります。

以下に例を示します。

スイフト5:

let indexPathsToReload = [indexPath1, indexPath2, indexPath3]
tableView.reloadRows(at: indexPathsToReload, with: .none)

目標C:

NSArray *indexPaths = @[indexPath1, indexPath2, indexPath3];
[self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];

または

NSArray *indexPaths = [NSArray arraywithobject:@"indexPath1", @"indexPath2", @"indexPath3",nil];
[self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
0
BLC

スイフト

使用できます

let selectedIndexPath = IndexPath(item:0 , section: 0)
self.tableView.reloadRows(at: [selectedIndexPath], with: .none)

特定のセルをリロードするため。

0