UITableViewの編集後の更新

編集可能なテーブルがあって、編集操作を行って元のテーブルに戻る時、編集結果の反映とテーブルの選択状態の解除の順番がちょっと違うだけでも表示結果が微妙におかしくなる事に気がついた。

編集して帰ってくるだけなので、単純にUITableViewControllerのviewWillAppearで編集結果を反映させる処理を実行させているのだけれど、reloadDataを追加するだけだと選択状態の解除のアニメーションがまるっとなくなる。巷で聞いた話だと、テーブルの行の永続的な選択状態とかフィードバックが無いというのはNGらしく、この辺りの挙動がガイドラインに沿っていないという理由でリジェクトを食らったという事例もあるらしい。

これはダメな例。

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

選択状態を解除するのは[super viewWillAppear:animated];のお仕事なので、こいつを遅延して実行させるようにしてみた。

- (void)viewWillAppear:(BOOL)animated {
	if (self.tableView.isEditing) {
		[self.tableView reloadData];
		[self performSelector:@selector(refreshTable) 
			withObject:nil afterDelay:0.2];
	} else {
		[super viewWillAppear:animated];
	}
}
 
- (void)refreshTable {
	[super viewWillAppear:YES];
}

ちなみに、Safariのブックマークの編集は選択状態解除のアニメーションが実行されないけど、どうなんでしょうね。