プログラムでView Controllerを作成し、ルートコントローラーとして設定しました。予想どおり、すべてが完璧に機能しました。
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
CustomViewController *vc = [[CustomViewController alloc] init];
[[self window] setRootViewController:vc];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
次に、UITabBarViewController を追加し、その 'viewControllers' プロパティをメインの viewController 'vc' (への配列) を指すように設定しました。
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
CustomViewController *vc = [[CustomViewController alloc] init];
UITabBarController *tbc = [[UITabBarController alloc] init];
NSArray *controllers = @[vc];
[tbc setViewControllers:controllers];
[[self window] setRootViewController:vc];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
起動時にビューが画面に表示されなくなり、ルートビューコントローラーが設定されていないという警告も表示されます。'vc' コントローラーのビューの下に文字列を追加すると、最終的に読み込まれますが、UIBarController が [[UIMainScreen bounds] を変更したかのように、画面の下部に空白行があります。
[[self window] addSubview:vc.view];
私は iOS 開発に不慣れで、少し混乱しています。ビュー コントローラーの階層について非常に基本的なことを理解していないようですが、Apple の「ビュー コントローラー プログラミング ガイド」を読んでも、どこが間違っているのかまだわかりません。
setRootViewController: メソッドは、引数ビュー コントローラーの _view をウィンドウのデフォルト ビューとして自動的に割り当てる必要がありますが、名前付きビュー コントローラーが以前に UITabBarViewController の viewControllers プロパティによってポイントされていた場合は発生しません。デバッガーを確認したところ、setViewControllers: メソッドが呼び出された後、「vc」オブジェクトが変更されていないことがわかりました。
何が起こっているのか説明してもらえますか、それとも読むべきドキュメントを教えてもらえますか?
更新:「vc」コントローラーを「tbc」コントローラーに挿入するつもりはありません。私が望むのは、「tbc」に関するコードなしで通常表示される「vc」ビューをフルスクリーンで表示することです。私の観点からは、別のビュー (私の場合は tbc) を追加しても、この動作には影響しません。
もちろん、それは実用的な観点からはまったく役に立ちませんが、内部で何が起こっているのか知りたいです。