Web サイトに似たナビゲーション メニューを持つ iPad アプリケーションを開発しています。画面の左側に一連のボタンがあるメニューを想像してください。ボタンをタップするたびに、別のコントローラーが表示されます。
グラフィックの制約により、OS が提供するコンテナー コントローラーを使用できないため、UITabBarController
. addChildViewController:
私が使用した方法、特にとの使用法が正しいかどうかを知りたいdidMoveToParentViewController:
私のコンテナの初期化では、これを行います:
MAHomeController *home = [[MAHomeController alloc] initWithNibName:@"MAHomeController" bundle:nil];
[self addChildViewController:home];
[home didMoveToParentViewController:self];
homeIndex = [self.childViewControllers indexOfObject:home];
[home release];
MAConfigHomeController *config = [[MAConfigHomeController alloc] initWithNibName:@"MAConfigHomeController" bundle:nil];
[self addChildViewController:config];
[config didMoveToParentViewController:self];
configIndex = [self.childViewControllers indexOfObject:config];
[config release];
MAViewerHomeController *viewer = [[MAViewerHomeController alloc] initWithNibName:@"MAViewerHomeController" bundle:nil];
[self addChildViewController:viewer];
[viewer didMoveToParentViewController:self];
viewerIndex = [self.childViewControllers indexOfObject:viewer];
[viewer release];
ご覧のとおり、すべてのコンテンツ コントローラーを一度にdidMoveToParentViewController:
追加し、追加後すぐに呼び出します。これでよろしいですか?
次に、コンテンツ間のナビゲーションを処理するメソッドは次のようになります。
// some stuff removed for brevity, mostly configuration stuff
UIViewController *fromCtrl = [self.childViewControllers objectAtIndex:currentIndex];
UIViewController *toCtrl = [self.childViewControllers objectAtIndex:index];
self.currentIndex = index;
[self transitionFromViewController:fromCtrl toViewController:toCtrl duration:0.7 options:opts animations:^(void) {} completion:^(BOOL finished) {
if (completion)
completion();
}];
完了ブロックでわかるようdidMoveToParentViewController:
に、新しく遷移したコントローラーは呼び出しません。これは、以前にchildViewControllers
コンテナーの に追加されたためです。また、古いコントローラーを削除することもありません。実際にはchildViewCOntrollers
、コンテナー コントローラーの割り当てが解除されるまで、古いコントローラーはアレイに残るためです。
すべてのイベントは、3 つの主要なコントローラー内にネストされた子コントローラーにも正しくルーティングされます。また、メモリが問題になることはありません。シミュレートされたメモリ警告により、表示されていないコントローラのビューがアンロードされ、再ロードされるからです。
このデザイン大丈夫?