Hatena::Groupiphone-dev

伊勢的iPhone

2010/07/05(Mon)

UINavigationController の view をviewにaddSubViewすると不幸になる

| 01:00 | はてなブックマーク - UINavigationController の view をviewにaddSubViewすると不幸になる - 伊勢的iPhone

時たま、こんなサンプルを見ますが、これってとってもトラブルの原因になってしまいます。

// 
- (void) viewDidLoad {
    // Interface Builder で Navigation Controller を別定義してあって、
    // File's Owner の View Controller の view にその view を突っ込もうとする
    [self.view addSubView:navControl.view];
}

たとえばこんな良くないことが・・・・

  • Navigation Controller ステータスバー分だけ下にずれる
  • UITableViewにUITextField入れても自動でサイズが変わってくれない(キーボードがせりあがって描画領域が減った分だけ縮むのが正しい)
  • Navigation Controller に View Controller を push しても viewWillAppear とかのビュー遷移のイベントが発生しない

これで1年半くらい悩んでました・・・orz

2010/09/27(Mon) 追記

これ、結局どうすればいいかわからんっていわれてたので、僕はこうしたという話を。

NavigationController 自体、またはその継承クラスを presentModalViewController で表示させるのがひとまず正しそうで、Interface Builderを使わずに以下のように継承クラスを作成。

// SettingViewController.h
@interface SettingViewController : UINavigationController {
@private
	MainSettingPageViewController* mainPage;
}

- (id) initWithSettingRootViewController;

- (void) dismiss;
@end

// SettingViewController.m
@implementation SettingViewController
@synthesize mainPage;

- (id) initWithSettingRootViewController {
	// Setup MainPage (RootView)
	return [self initWithRootViewController:[[MainSettingPageViewController alloc] initWithOwner:self]];
}

- (void) dismiss {
	[self dismissModalViewControllerAnimated:YES];
}

@end

そしてあとはこいつをインスタンス化してpresentModalViewControllerで表示。

[self presentModalViewController:[SettingViewTestAppDelegate appDelegate].settingController animated:YES];

「そういえばUINavigationControllerもUIViewControllerの派生クラスだよなー」と思って試してみたらうまくいきました。

ootas5ecootas5ec2010/07/06 13:46こういう情報ってどうしてなかなか検索しても引っかからないんでしょうかね。
splitViewControllerはmodal表示できないとか、検索してもなかなか出てこなかったんですよね...

goldfishbowlgoldfishbowl2010/09/28 17:54呟いた者です。ご親切にありがとうございました!!