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 とかも参照できる。最初から原文のリファレンスを見るべきだった。