UITableViewを組み込んだViewを表示する度にテーブル全体を更新(reloadData)したい場合

By | 2015年1月11日

画面を表示(≠メモリロード)する度にテーブル全体を更新をしたい場合は、以下のようにviewWillAppear内にreloadDataを記述します。

- (void)viewWillAppear:(BOOL)animated
{
        [self.tableView reloadData];
        [super viewWillAppear:animated];
}

重要なのはsuperクラスのメソッドを呼ぶ前でリロードすることです。先に呼んでしまうと2回ロードされるなど、うまく動作しません。やってしまいがちなのは、viewDidLoadやviewDidAppear内にreloadDataを記述し、フラグなどで制御する方法です。それでも可能ですし、そのような方法しか取れないプログラム仕様もあるかとおもいますが、上述の方法が一番スッキリします。

なお、テーブル全体ではなく部分的に更新したい場合もあるかとおもいますので、以下簡単に載せておきます。

// 指定した1つのセクションのみ更新
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationNone];
// 複数のセクションを指定して更新
NSRange range = NSMakeRange(0, 3);
[self.tableView reloadSections:[NSIndexSet indexSetWithIndexesInRange:range] withRowAnimation:UITableViewRowAnimationNone];
// 指定したセルのみ更新
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:1 inSection:0];
[[self.tableView cellForRowAtIndexPath:indexPath] setNeedsLayout];
// 画面上に見えている範囲のセルのみ更新
for (UITableViewCell *cell in [self.tableView visibleCells]){
    [self updateCell:cell atIndexPath:[self.tableView indexPathForCell:cell]];
}

余談ですが、セルを一括して追加削除する場合、

[self.tableView beginUpdates];
     // ここに追加や削除の処理を記述
[self.tableView endUpdates];

このようにbeginUpdates/endUpdatesで囲むと、indexPathを明示的に処理しなくても自動的に調整してくれます(endUpdatesが呼ばれた後にcellForRowAtIndexPathが呼ばれる)。


One thought on “UITableViewを組み込んだViewを表示する度にテーブル全体を更新(reloadData)したい場合

  1. Pingback: UITableViewの表示がおかしい時、確認すること | Hack

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です