Table View の中で、あるセルがタップされた時、次のメソッドが呼ばれます。
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
引数は呼び出された View と、その位置を示します。Table View の基本で見たとおり、indexPath.section でセクション番号、indexPath.row で行番号を取得できます。
このメソッドの実装で、indexPath をもとに新しい画面を開きます。
新しい画面を開くということは、新しい UIView と、それをコントロールする新しい UIViewController (あるいは、そのサブクラス)のインスタンスが必要になるということです。
UIViewController のインスタンスは、IBOutlet で保存しておく方法と、コードで直接インスタンスを作る方法があります。
IBOutlet を使う時は、ヘッダファイルに以下のようにアウトレットを追加します。
IBOutlet UIViewController *controller;
サブクラスを用いる場合は、UIViewController をそのサブクラス名に直します。
Interface Builder のほうでも、現在の xib ファイルに UIViewController を追加し、アウトレットを接続します。
サブクラスを用いる場合は、インスペクタで Attributes の Nib Name と Class Identity を手動で変えます。


コードで生成する場合も、同様にクラス名と xib ファイル名を指定して初期化することになります。
CityViewController *controller;
controller = [[[CityViewController alloc]
initWithNibName:@"CityViewController"
bundle:nil] autorelease];
いずれかの方法でインスタンスを生成できたら、実際に表示を行います。
[self.navigationController
pushViewController: controller
animated: YES];
現在の Table View Controller ではなく、その上の Navigation Controller に対してメソッドを実行しているのに注意してください。Navigation Controller は現在の View の次の階層として、新しい View を表示することになります。
これで、前回の次の画面がスライドして表示されます。

左上の、元の View に戻るためのボタンは自動で生成されます。
ここで、先ほどの pushViewController: animated: の代わりに、次のメソッドを使ったとします。
[self presentModalViewController: controller animated: YES];
こうすると、新しい画面は下からスライドして出てきます。前回で説明したダイアログ表示に用います。
このメソッドは UIViewController 自体に対して実行するもので、Navigation Controller は関与しません。従って、元の画面に戻るためのボタンは自分でどこかに追加する必要があります。
元の画面に戻る時は、以下のメソッドを使います。
[self dismissModalViewControllerAnimated: YES];
ありがとう