0

私は2つのrootViewControllerを持つゲームを持っています.1つはメニュー用、もう1つはゲームそのものです。2台のルートビューコントローラを交換する方法

ユーザーがゲームとメニューを切り替えると、rootViewControllerを切り替える必要があります。最終的に私の質問は、これを行うための最善の方法は何ですか?または、2つのrootViewControllerを持つよりも意味をなさないスタックを切り替える別の方法がありますか?

私はappDelegateにnavigationControllerのインスタンスを持っています。私はrootViewControllerを切り替えたいときは、新しいnavigationControllerを初期化し、それをrootVCに設定し、appDelegateのnavControllerのインスタンスに設定します。メニューからゲームに移行するコードは、次のようになります。

//Initialise the new Root Controller 
GameViewController *rootController = [[GameViewController alloc] init]; 

UINavigationController *newNavController = [[UINavigationController alloc] initWithRootViewController:rootController]; 
[rootController release]; 
newNavController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
[self presentModalViewController:newNavController animated:YES]; 

//Setting the appDelegate's navController to the new navController allows the menu to dealloc. 
//This must happen AFTER the newNavController has been loaded. 
MiniAppDelegate *appDelegate = (MiniAppDelegate *)[[UIApplication sharedApplication] delegate]; 
appDelegate.navController = newNavController; 
[newNavController release]; 

この悪い練習ですか?私はバックグラウンドから再開したときに私のアプリに問題があり、これがその原因になっていると思う。

+0

あなたのゲームを構築するためにCocos2dフレームワークを使用していない具体的な理由はありますか? Cocos2dでは、さまざまなシーンとレイヤーを切り替えることが非常に簡単です。 – azamsharp

+0

私はCocos2dを最初に作ったときに見たことはありませんでしたが、現在はそれを改造するのに少し遅れています...しかし、おそらく次のアプリに使用します。 – Smikey

答えて

0

モーダルビューコントローラを表示せず、基になるビューコントローラを管理するUIViewControllerを使用するとうまくいくかもしれません。これと同様に

// MainNavigationController extends UINavigationController 

@property (nonatomic,retain) UIViewController childViewController 

-(void)viewDidLoad { 
    self.childViewController = [MenuViewController alloc] initWithNibName...]; 
    [self pushViewController:childView...]; 
} 

-(void)launchGame { 
    self.childViewController = [GameViewController alloc] ... ]; 
    self.viewControllers = [NSArray array]; 
    [self pushViewController:childView...]; 
} 

あなたの現在のビューコントローラにすべての時間を参照を保持し、一箇所でそれらの表示を管理するこの方法です。

デリゲートメソッドを使用できるように、両方の子ビューコントローラーにMainNavigationControllerへの参照を渡す必要があります。

編集:

明確にするためのもの最初のコメントについてのビット:はい、MainNavigationControllerはメニューとゲーム自体の表示を処理し、あなたのアプリの出発点です。

self.viewControllers = [NSArray array]は、ゲームを起動するときに現在のビューコントローラのリストを空にするために使用されます。これは、単にメニューを押すのではなく、メニューをゲームに置き換えるために行われます。この方法では、ユーザーがメニュー、ゲーム、メニューなどに行くときに8つのビューコントローラーがありません。

ゲームをプレイ中にメニューを開くのにも同様の方法が使用されます。ボタンはMainViewControllerにメニューを開くように要求します。launchGameメソッドが動作するのと同じ方法か、のどちらでも、ゲームの状態を維持するためのモーダルな方法を提示するか、ゲーム内のメニューを小さくするか、そこから何かを処理するさまざまな方法があります。

+0

私のappDelegateにこのMainNavigationControllerのインスタンスを作成しますか? NavControllersを切り替えるときはいつでもこのインスタンスを参照します。あなたはself.viewControllers = [[NSArray array] arrayWithObject:self.childViewController];という意味ですか?私はコードにかなり従っていません... – Smikey

+0

この1つを詳しく説明するために投稿を編集しました –

+0

右 - 私はそれを得ていると思います。前に(カテゴリーとは対照的に)クラス拡張を使用していない。それらについて読んだら、それはどのクラスのヘッダや実装ファイルにも必要なメソッドを宣言する方法だと理解しています...そして、同じクラスの実装でこれらのメソッドを定義してください。だから私は@interface UINavigationController()の行にあなたのメソッドの宣言を作成しますが、どこにでも置くことができますか?どの場合、どのクラスに入れますか? X-codeで新しい 'Objective-Cクラス拡張'を作成すると、ヘッダファイルのみが作成され、実装は行われません。ビット混乱..しかし、感謝! – Smikey

0

あなたが最初のメニューコントローラにフィールドとしてGameViewControllerを追加し、この

ような何かを行うことができます

その後、(メニューコントローラクラスで)

if(myGameViewController == nil) { 
    myGameViewController = [[GameViewController alloc] 
    initWithNibName: @"GameView" bundle: nil]; 
} 
[self presentModalViewController: self.myGameViewController animated:YES]; 

それを表示するためにこれを使用し、次にそれを削除するために使用します(GameViewControllerクラス内)

[self.parentViewController dismissModalViewControllerAnimated: YES]; 

これは、ゲームビューをメニュービューの子として開きます。これは、少なくともGameViewControllerをRootViewControllerではなくUIViewControllerにする必要があります。

+0

問題は、[self.navigationController pushViewController:anotherViewController animated:YES]のようなものを使って、ゲームビューで後続のviewControllerをプッシュすると問題になります。おそらく表示されないメニュースタックに新しいVCをプッシュしているので、何も起こりません... – Smikey

+0

'[self presentModalViewController:self.myGameViewController animated:YES];'を使用してUIViewControllerの上に新しいビューをプッシュします「メニュービューでゲームコントローラをプッシュし、ゲームビューで後続のビューを押しても問題はありません。私はさまざまなUIViewControllerでこれを正確に行うアプリケーションを持っています。 – twain249

+0

しかし、あなたはナビゲーションバーを失い、あなたが押したときに自動的に継承する動作を得るために、あなたが提示したすべてのVCに対して手動でそれを設定しなければなりませんか? – Smikey

0

メインビューのコントローラーをrootViewコントローラーとして使用し、他のすべてのビューをモーダルにプッシュすることはできませんか?またはiOS5の新しい[self presentViewController:...]を使用するだけですか?

メニュービューが複数ある場合でも、いつでも[UIApplication sharedApplication]のrootViewコントローラからメインメニューにアクセスできますか?またはさらに[self presentingViewController]

関連する問題