XCode 4.2 の iOS (iPhone) の Navigation Application に埋めこまれた Table View Controller から Nagivation Controller にアクセスする(下の階層に移動させる)

UINavigationController の rootViewController に、UITableViewController のサブクラスとして作成された MyTableViewController クラスを指定してあるとする。このとき、MyTableViewController が管理する TableView の Cell が選択されたとき、ひとつ下の階層に移動する (UINavigationController に新たな階層を追加する) 方法がわからんかった。

結論からいえば

  • MyTableViewController の tableView:didSelectRowAtIndexPath: メソッドの中に、[ [ self navigationController] pushViewController:newViewController animated:YES]; みたいなコードを書けばいい。

というだけのことだった。具体的には、下記のドキュメントの 70P にサンプルコードがある。

以下に、コードを引用する。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
     [tableView deselectRowAtIndexPath:indexPath animated:NO]; 
     BATTrailsViewController *trailsController = [[BATTrailsViewController alloc]
            initWithStyle:UITableViewStylePlain];
     trailsController.selectedRegion = [regions objectAtIndex:indexPath.row];
     [[self navigationController] pushViewController:trailsController animated:YES];
     [trailsController release];
}

この例では、BATTrailsViewController というカスタムクラスを下の階層を管理する ViewController クラスとして指定している。

要するに何がわからんかったって、[self navigationController] で UINavigationController のインスタンスを参照できるというのがわからんかった。検索して出てくる例では、自力で UINavigationController を alloc してインスタンスを保持して、そのインスタンスに pushViewController:animated: メッセージを直接飛ばすようなコードばかりだった。IB を使わずに作る場合はこれでいいんだけど、IB を使って作る場合にはこれだと困る。

UIViewController Class Reference ← このドキュメントの 21P に説明がある。同じような感じで、tabBarController とか splitViewController とかも参照できる。最初から原文のリファレンスを見るべきだった。