1

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 つの主要なコントローラー内にネストされた子コントローラーにも正しくルーティングされます。また、メモリが問題になることはありません。シミュレートされたメモリ警告により、表示されていないコントローラのビューがアンロードされ、再ロードされるからです。

このデザイン大丈夫?

4

1 に答える 1

1

iOS開発センターのViewControllerガイドを読んだ場合、addChildViewController:とdidMoveToParentViewController:に制約はありません。これにより、実行している順序が正しくなくなります。

私が違うことをする唯一のことは、実際にビューを表示するまでiOSがペン先をロードしないように、これを遅らせる可能性があることです。プロファイラーを実行すると、親コンテナーを初期化するときにすべてのペン先が読み込まれることになります。

于 2012-10-03T14:33:17.367 に答える