24/7 twenty-four seven

iOS/OS X application programing topics.

UITableViewControllerを使わないでテーブルビューを使うとき実装すべきメソッド

テーブルビューを使う場合に審査で気をつけること - 24/7 twenty-four seven
上記の記事で書いたように、テーブルビューの見た目でリジェクトされないように、コントローラにUITableViewControllerを使わない場合は、行の選択解除などをやってくれないので、自分で実装する必要があります。


次のドキュメントにあるように、UITableViewControllerはいくつかの操作を暗黙的に行います。

  • テーブルが表示される際(viewWillAppear:)に、データのリロード、選択行の解除。
  • テーブルが表示された後(viewDidAppear:)に、スクロールバーの点滅。
  • ナビゲーションバーの編集/完了ボタンを押したときに編集/通常モードに移行。

The UITableViewController class creates a controller object that manages a table view. It implements the following behavior:

  • When the table view is about to appear, it reloads its data and clears its selection (with or without animation, depending on the request). The -UITableViewController class implements this in the superclass method viewWillAppear:.
  • When the table view has appeared, the controller flashes the table view’s scroll indicators. The UITableViewController class implements this in the superclass method viewDidAppear:.
  • It implements the superclass method setEditing:animated: so that if a user taps an Edit|Done button in the navigation bar, the controller toggles the edit mode of the table.
iOS Developer Library


ツールバーを使いたいときは、UIViewにテーブルビューとツールバーを乗せるので、普通のUIViewControllerを使います。
そういう場合に限らず、UITableViewControllerを使えるときの方が意外と少ないので、選択を解除し忘れたとかでリジェクトにならないよう注意しましょう。
以下のように書いておけばたいてい通用します。


viewWillAppear:とviewDidAppear:の部分は必須だと考えていいと思います。
setEditing:animated:は編集が必要な場合のみ、didRotateFromInterfaceOrientation:も横画面を使わないなら不要です。

// The following three methods must be implented in a UIViewController
// that manages a UITableView but which isn't a UITableViewController
//	==============================================================
//	setEditing:animated:
//	==============================================================

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

//	==============================================================
//	viewWillAppear:
//	==============================================================

- (void)viewWillAppear:(BOOL)animated
{
	// Unselect the selected row if any
	NSIndexPath*	selection = [self.tableView indexPathForSelectedRow];
	if (selection)
		[self.tableView deselectRowAtIndexPath:selection animated:YES];

	[self.tableView reloadData];
}

//	==============================================================
//	viewDidAppear:
//	==============================================================

- (void)viewDidAppear:(BOOL)animated
{
	//	The scrollbars won't flash unless the tableview is long enough.
	[self.tableView flashScrollIndicators];
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
	[self.tableView flashScrollIndicators];
}

UITableViewCell stays highlighted - MacRumors Forums