9

この質問を通じて、ルート ビュー コントローラーの概念をよく理解しているかどうかを知りたいです。

iOS アプリケーションでは、ルート ビュー コントローラー (RVC) は、起動時にビューが UIWindow アプリケーションに追加されるコントローラーですよね?

[window addSubview:rvcController.View];
[window makeKeyAndVisible];

現在、UIWindow には rootViewController プロパティもあります。前のコード スニペットを実行するとき、そのプロパティには rvcController が設定されますか、それとも明示的に設定する必要がありますか?

次に、UINavigationController で、エントリ ポイントに設定された以前の RVC とは異なる RVC を設定できます。

この場合、最初にコントローラーを navigationController スタックに追加する (新しいコントローラーをプッシュする) ときに、フレームワークはそのコントローラーを navigationController の RVC として設定しinitWithRootViewControllerますか?それともメソッドを介して明示的に設定する必要がありますか?

4

4 に答える 4

20

ええと..私がiPhone開発を始めたとき.. rootViewController のことも私をループに陥れました。しかし、それは本当に簡単です。

アプリが起動したら、アプリのデリゲート クラスに UIWindow オブジェクトを作成します。また、そのクラスには、window と呼ばれる UIWindow 型のプロパティがあります。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    UIWindow *w = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
    self.window=w;
    [w release];
    // other code here...
}

UIViewController次に、ウィンドウ階層の最初のビューとなるを作成しviewます。これは「ルート ビュー コントローラー」と呼ばれます。

紛らわしいのはUINavigationController、「ルート ビュー コントローラー」として を作成することが多く、そのナビゲーション コントローラーには、スタックに配置する最初のビュー コントローラーである「RootViewController」を要求する init メソッドがあることです。

したがって、ウィンドウは「ルート ビュー コントローラー」を取得しUINavigationControllerます。これは、表示する最初のビュー コントローラーである RootViewController も持っています。

あなたがそれを整理したら、それはすべて理にかなっています..私は思う:-)

ここにすべてを行うコードがあります..(目の前で開いているプロジェクトから取得)

//called with the app first loads and runs.. does not fire on restarts while that app was in memory
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    


    //create the base window.. an ios thing
    UIWindow *w = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
    self.window=w;
    [w release];

    // this is the home page from the user's perspective
    //the UINavController wraps around the MainViewController, or better said, the MainViewController is the root view controller
    MainViewController *vc = [[MainViewController alloc]init];

    UINavigationController *nc = [[UINavigationController alloc]initWithRootViewController:vc];
    self.navigationController=nc;  // I have a property on the app delegate that references the root view controller, which is my navigation controller.

    [nc release];
    [vc release];

    //show them
    [self.window addSubview:nc.view];
    [self.window makeKeyAndVisible];

    return YES;
}
于 2011-04-30T14:12:17.283 に答える
8

現在、UIWindow には rootViewController プロパティもあります。前のコード スニペットを実行すると、そのプロパティは rvcController で設定されますか、それとも明示的に設定する必要がありますか?

明示的に設定する必要があります。addSubviewその場合は、ルート ビュー コントローラーを設定すると自動的に処理されるため、行を削除できます。

次に、UINavigationController で、エントリ ポイントに設定された以前の RVC とは異なる RVC を設定できます。

もちろん、ナビゲーション コントローラーのルート ビュー コントローラーは、ウィンドウのそれとは何の関係もありません。

この場合、最初にコントローラーを navigationController スタックに追加する (新しいコントローラーをプッシュする) ときに、フレームワークはそのコントローラーを navigationController の RVC として設定しますか、それとも initWithRootViewController メソッドを介して明示的に設定する必要がありますか?

initWithRootViewController は、空のナビゲーション コントローラーを初期化し、最初の (ルート) ビュー コントローラーをスタックにプッシュするための単なるショートカットです。rootViewControllerは のプロパティではないことに注意してください。UINavigationController経由でアクセスします[navController.viewControllers objectAtIndex:0]

于 2011-04-30T14:06:14.393 に答える