iPhoneのナビゲーションで詳細ページを出す時のテクニック


iPhoneのアプリでよくあるインターフェースがリストを表示してアイテムを選択すると詳細ページを表示するというパターンだ。

table

上のリストの一つをタップすると詳細ページが表示される。
これだけだったら以下のコードをtableViewControllerに追加すれば実現できる。

tableViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
	// テープルコントローラーで何番目のセルが選択されたか
	NSInteger row = [indexPath row];
       // nibファイルを読み込んで詳細ページのコントローラーを生成
	if (detailViewController == nil){
		LocationMemoDetailViewController *memoDetail = [[LocationMemoDetailViewController alloc] initWithNibName:@"MemoListDetailView" bundle:nil];
		detailViewController = memoDetail;
		[memoDetail release];
	}
       // 詳細ページへ切り替え
	[navController pushViewController:detailViewController	animated:YES];
}

上のコードはtableViewControllerのリストアイテムがタップされたときに呼ばれるdidSelectRowAtIndexPathメソッドである。
コードのdetailViewControllerが詳細ページのコントローラークラスである。
これで詳細ページに何か情報を渡したいい場合は以下のようなコードを追加すればよさそうに思われるだろう。

tableViewController.m

detailViewController.nameField.text = @"山田 太郎";

ここでnameFieldは詳細ページ上にあるUITextFieldのオブジェクトである。
しかし、これで詳細ページを表示しても設定された値は表示されない。
どうやら詳細ページの中身が生成されるのは表示されるときのようなのでnibファイルを読み込んだだけではアクセスできないようである。
この場合、detailViewControllerクラスにテキストフィールドに表示するデータを一時保管しておく変数を追加する。

detailViewController.h

@interface LocationMemoDetailViewController : UIViewController {
...
NSString *name;
}
@propety(nonatomic,retain) NSString* name
</pre>

detailViewController.m
<pre name="code" class="java">
...
@synthesize name

そしてtableViewController側にはviewWillAppearメソッドを以下のように追加する。

- (void)viewWillAppear: (BOOL) animated {
	self.nameField.text = self.name;
}

つまり、詳細ページが表示されたときに一時保管してある文字列をテキストフィールドに設定するのである。

このあたりはiPhoneのUIの中身が隠蔽されているのでわかりにくい部分だ。
APIを呼ぶだけで結構な仕事をしてくれるので楽なのだが、その引き換えに中の動きがわかりずらくとまどうことが多い。
このあたりもiPhoneで開発する上でのノウハウなのだろう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です