68

通常、iOS ウィンドウのルート ビュー コントローラーは、最初にタブ バー コントローラーまたはナビゲーション コントローラーに一度初期化されますか? アプリ内でルート ビュー コントローラーを複数回変更しても問題ありませんか?

ユーザー アクションに基づいてトップ ビューが異なるシナリオがあります。スプラッシュスクリーンの画像を持つトップビューコントローラーを備えたナビゲーションコントローラーを用意し、必要に応じてビューコントローラーをプッシュ/ポップすることを考えていました。または、ウィンドウのトップ ビュー コントローラーを変更し続けることもできます。どちらがより良いアプローチになりますか?

4

6 に答える 6

52

iOS 8.0、Xcode 6.0.1、ARC 対応

あなたの質問のほとんどは答えられました。しかし、最近自分で対処しなければならなかった問題に取り組むことができます。

アプリ内でルート ビュー コントローラーを複数回変更しても問題ありませんか?

答えはイエスです。アプリの一部であった最初のUIViewの後にUIView階層をリセットするために、最近これを行う必要がありました。起動する必要がなくなりました。つまり、アプリの後でいつでも他の UIViewController から「rootViewController」をリセットできます。"didFinishLoadingWithOptions".

これをする...

1) アプリへの参照を宣言します。デリゲート(「テスト」と呼ばれるアプリ)...

TestAppDelegate *testAppDelegate = (TestAppDelegate *)[UIApplication sharedApplication].delegate;

2) 「rootViewController」にしたい UIViewController を選択します。ストーリーボードから、またはプログラムで定義します...

    a) ストーリーボード (識別子、つまり、storyboardID が UIViewController の Identity Inspector に存在することを確認します):

UIStoryboard *mainStoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

NewRootViewController *newRootViewController = [mainStoryBoard instantiateViewControllerWithIdentifier:@"NewRootViewController"];

    b)プログラムで(サブビューなどを追加できます)

UIViewController *newRootViewController = [[UIViewController alloc] init];
newRootViewController.view = [[UIView alloc] initWithFrame:CGRectMake(0, 50, 320, 430)];
newRootViewController.view.backgroundColor = [UIColor whiteColor];

3) まとめて…

 testAppDelegate.window.rootViewController = newRootViewController;
[testAppDelegate.window makeKeyAndVisible];

4) アニメーションを挿入することもできます...

testAppDelegate.window.rootViewController = newRootViewController;
    [testAppDelegate.window makeKeyAndVisible];

newRootViewController.view.alpha = 0.0;

    [UIView animateWithDuration:2.0 animations:^{

        newRootViewController.view.alpha = 1.0;

    }];

これが誰かを助けることを願っています! 乾杯。

ウィンドウのルート ビュー コントローラー。

ルート ビュー コントローラーは、ウィンドウのコンテンツ ビューを提供します。ビュー コントローラーをこのプロパティに割り当てると (プログラムまたは Interface Builder を使用して)、ビュー コントローラーのビューがウィンドウのコンテンツ ビューとしてインストールされます。ウィンドウに既存のビュー階層がある場合、新しいビューがインストールされる前に古いビューが削除されます。このプロパティのデフォルト値は nil です。

*2015 年 9 月 2 日更新

以下のコメントが指摘しているように、新しいView Controllerが表示されたら、古いView Controllerの削除を処理する必要があります。これを処理する遷移ビュー コントローラーを選択することもできます。これを実装する方法に関するいくつかのヒントを次に示します。

[UIView transitionWithView:self.containerView
                  duration:0.50
                   options:options
                animations:^{

                    //Transition of the two views
                    [self.viewController.view removeFromSuperview];
                    [self.containerView addSubview:aViewController.view];

                }
                completion:^(BOOL finished){

                    //At completion set the new view controller.
                    self.viewController = aViewController;

                }];
于 2014-10-16T11:19:58.013 に答える
47

「提示されたView Controller」(presentViewController:animated:completion:)を使用するのがより一般的です。これらは好きなだけいくつでも持つことができ、ルート ビュー コントローラーの前に効果的に表示されます (基本的には置き換えられます)。必要がない場合は、アニメーションを使用する必要はありません。提示されたView Controllerを閉じて元のルートView Controllerに戻ることができますが、そうする必要はありません。提示されたView Controllerは、必要に応じて永久に存在できます。

私の本から提示されたView Controllerに関するセクションは次のとおりです。

http://www.apeth.com/iOSBook/ch19.html#_presented_view_controller

この図 (その章の前半) では、提示されたビュー コントローラーがアプリ インターフェイスを完全に引き継いでいます。ルート ビュー コントローラーとそのサブビューはインターフェイスになくなりました。ルート ビュー コントローラーはまだ存在しますが、これは軽量で問題ありません。

ここに画像の説明を入力

于 2013-04-02T21:10:08.667 に答える