3

私はiPhoneの初心者プログラマーです。初めてのゲーム/アプリの開発で、自分に問題が発生しました (問題を作成しました)。私はこれを調査しましたが、答えを見たと思いますが、アプリケーションでそれらを機能させる方法がわかりません。

ウェルカム、プレイ、ハイスコア、設定、概要など、いくつかのビューコントローラーを持つゲームがあります。認識しているナビゲーション コントローラーまたはルート コントローラーを持っていません。編集 - rootview コントローラーができました - [self.window setRootViewController:viewController];appDelegate.m ファイルに追加しました

ウェルカム スクリーン/ビュー コントローラーから、Play ビュー コントローラー、about ビュー コントローラー、ハイ スコア ビュー コントローラー、または prefs ビュー コントローラーに移動できます。ウェルカムビューコントローラーを閉じることができるように、私が今行っている新しいコントローラーを担当させたいと思います。実際、View Controller にアクセスするときはいつでも、他の View Controller をメモリから消去できるようにしたいと考えています。ほとんどのビューコントローラーからほとんどのビューコントローラーアクセスできます。

これを使用して新しいView Controllerに移動します:

- (IBAction)playGameAction:(id)sender {
    FlipTestViewController *myViewController = [[FlipTestViewController alloc]

   initWithNibName:@"FlipTestViewController" bundle:nil];

    [UIView beginAnimations:@"flipview" context:nil];
    [UIView setAnimationDuration:1];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft 
                           forView:self.view cache:YES];

    [self.view addSubview:myViewController.view];

    [UIView commitAnimations];
}

FlipTestViewController (再生コントローラー) で安全に作業を終えたら、WeclomeViewController を解放するにはどうすればよいですか? そして、新しいコントローラーに、それが現在担当していて、他のコントローラーが離れることができることをどのように伝えることができますか? 私は意味のある質問をしていますか?応答するときは、短い単語と具体的な例を使用してください。ありがとうございました!

rdelmar のアドバイスに従って、RootvVewController をボタン コードに変更するための呼び出しを追加してみました。これは、新しい viewController を起動するために使用するコードです。

- (IBAction)playGameAction:(id)sender {
    FlipTestViewController *myViewController = [[FlipTestViewController alloc]
                                                      initWithNibName:@"FlipTestViewController"
                                                      bundle:nil];

    [UIApplication sharedApplication].delegate.window.rootViewController = myViewController;
    [UIView beginAnimations:@"flipview" context:nil];
    [UIView setAnimationDuration:1];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft 
                           forView:self.view cache:YES];

    [self.view addSubview:myViewController.view];

    [UIView commitAnimations];

}

案の定、コメントを見ると、FlipTestViewController (私の Play コントローラー) が新しい RootViewController です。残念ながら、空白の白い画面が表示され、どのような遷移も行われず、FlipTestViewController の ViewDidDisappear が何らかの形で呼び出されていることを示すログ メッセージが表示されます。おそらく、ウェルカム画面がまだ何とか残っているからでしょう。おそらくメモリ管理の問題?これを新しい質問に持っていくべきですか?

main.xib ファイルの背景色を変更したところ、明らかにそれが表示されている画面 (空白の白い画面) です。

4

3 に答える 3

2

View Controller をモーダルに表示するには、次の方法を試してください。

- (IBAction)playGameAction:(id)sender {
    FlipTestViewController *myViewController = [[FlipTestViewController alloc] initWithNibName:@"FlipTestViewController" bundle:nil];

    myViewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self presentViewController:myViewController animated:YES completion:nil];
}

これにより、現在のビューの上に FlipTestViewController がフリップ トランジション スタイルで配置されます。

次に、View Controller を閉じるには、これを FlipTestViewController のコントロール (通常はボタン) に接続します。

- (IBAction)dismissViewController:(id)sender {
    [self dismissViewControllerAnimated:YES completion:nil];
}

これにより、同じフリップアニメーションでView Controllerが閉じられます

于 2012-08-17T19:57:45.057 に答える
1

目的を達成する最も簡単な方法は、アプリのウィンドウの rootViewController プロパティをリセットすることです。アプリのどこからでも、[UIApplication sharedApplication].delegate.window.rootViewController を使用してルート ビュー コントローラーへの参照を取得できます。したがって、次のビュー コントローラーに切り替えるために使用しているアクション メソッドで、そのコントローラーを初期化してから、ウィンドウの rootViewController プロパティをそのコントローラーに設定することができます。コントローラーへの他の参照を保持しない場合は、プロパティをリセットするときに古いものの割り当てを解除する必要があります (これは、必要なものである場合とそうでない場合があります。ハイスコアや場所を追跡するプロパティが必要になる場合があります)。たとえば、プレーヤーはゲームに参加していました)。

アプリ デリゲートには通常、次のようなコードがあります (単一のビュー プロジェクトから開始する場合)。

 WelcomeController *welcome = [[WelcomeController alloc] initWithNibName:@"ViewController" bundle:nil];
 self.window.rootViewController = welcome;

したがって、起動時に表示したいView Controllerを使用して、アプリデリゲートにそのようなものを配置します。次に、ビュー コントローラー コード (または、ビュー コントローラーを切り替えるためのボタンを配置する場所) に、次のようなものがあります (テスト プロジェクトでセグメント化されたコントロールを使用しました)。

-(IBAction)selectController:(UISegmentedControl *)sender {
    if (sender.selectedSegmentIndex == 0) {
        PlayViewController *player = [[PlayViewController alloc] initWithNibName:@"PlayViewController" bundle:nil];
        [UIApplication sharedApplication].delegate.window.rootViewController = player;
    }else{
        HighScores *scorer = [[HighScores alloc] initWithNibName:@"HighScores" bundle:nil];
        [UIApplication sharedApplication].delegate.window.rootViewController = scorer;
    }
}
于 2012-08-18T15:44:35.200 に答える
0

簡単な方法は、Navigation Controller を使用することです。画面のシーケンスに役立つプッシュ/ポップの利点を得ることができます。

次に、次の方法で特定のコントローラーにポップできます。

- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated

これにより、他のすべてを経由することなく、既に表示されている特定のビュー コントローラーに移動できます。

また、あまり知られていませんが、コントローラーのスタック全体を次のように置き換えることができます。

- (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated

これにより、基本コントローラーがインデックス 0 のコントローラーに置き換えられます。

したがって、上部のツールバーとすべてのナビゲーション コントローラー機能を簡単に取得できます。また、すべてを単一のコントローラーにリセットしたい場合は、次のようにします...

    [navController setViewControllers:@[viewController] animated:YES];

編集

自分が何を望んでいるのか本当にわからないようですね。したがって、車輪の再発明を試みるのではなく、ある程度の余裕を持たせる必要があります。

ナビコントローラーがいいと思います。複数のコントローラーを管理する方法を既に知っておりsetViewControllers、任意のコントローラーから別のコントローラーに移動しているように見せることができますが、メインの作業センターとして同じナビゲーション コントローラーを保持することができます。

それ以外の場合は、これをすべて自分で行うことができます

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion

- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion

ルート ビュー コントローラーから呼び出すことができます。コントローラーを変更する場合は、現在のコントローラーを閉じて、新しいコントローラーを提示します。

于 2012-08-17T23:08:41.093 に答える