画面上で UINavigationController とカスタム UIViewController を一緒に保持するコンテナー ビュー コントローラーを作成しようとしています。
私はそれをテスト プログラムに配置しましたが、完全に動作しますが、実際のプロジェクトに実装しようとすると、含まれているビュー コントローラーの外観メソッドが呼び出されません。
働くテスト:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
MasterStatusViewController *master = [[MasterStatusViewController alloc] init];
[self.window setRootViewController:master];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
- (void)viewDidLoad {
[super viewDidLoad];
InventoryViewController *newInventory = [[InventoryViewController alloc] init];
self.navigation = [[UINavigationController alloc] initWithRootViewController:newInventory];
self.statusRibbon = [[StatusBarViewController alloc] initWithNibName:@"StatusBarViewController" bundle:nil];
[self addChildViewController:self.navigation];
self.navigation.view.frame = self.navigationView.frame;
[self.view addSubview:self.navigation.view];
[self.navigation didMoveToParentViewController:self];
[self addChildViewController:self.statusRibbon];
self.statusRibbon.view.frame = self.ribbonView.frame;
[self.view addSubview:self.statusRibbon.view];
[self.statusRibbon didMoveToParentViewController:self];
}
失敗したプロジェクト:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
MasterViewController *master = [[MasterViewController alloc] init];
self.centerController = master;
[self.window setRootViewController:master];
[self.window makeKeyAndVisible];
return YES;
}
- (void)viewDidLoad {
[super viewDidLoad];
LoginViewController *login = [[LoginViewController alloc] init];
self.navigation = [[UINavigationController alloc] initWithRootViewController:login];
self.statusRibbon = [[StatusRibbonViewController alloc] init];
[self addChildViewController:self.navigation];
self.navigation.view.frame = self.navigationView.frame;
[self.view addSubview:self.navigation.view];
[self.navigation didMoveToParentViewController:self];
[self addChildViewController:self.statusRibbon];
self.statusRibbon.view.frame = self.ribbonView.frame;
[self.view addSubview:self.statusRibbon.view];
[self.statusRibbon didMoveToParentViewController:self];
}
ビューは正しく配置され、外観メソッドが呼び出されないことを除いて、期待どおりに実行されます。私はかなり困惑しています。メソッドを手動で呼び出すことは、これらの呼び出しも行われないため、解決策ではないようです。
編集:外観方法とは、viewWillAppear、viewDidAppearなどを意味します。
2番目の編集:
~中略~
3番目の編集:さらに調べたところ、外観ライフサイクルメソッドが呼び出されていない理由は、コンテナビューコントローラーでも呼び出されていないためだと思います。追加した
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSLog(@"MasterViewController VIEW WILL APPEAR");
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
NSLog(@"MasterViewController VIEW DID APPEAR");
}
なんらかの理由で呼び出されmasterViewController
ません。