1

プログラムで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) を追加しても、この動作には影響しません。

もちろん、それは実用的な観点からはまったく役に立ちませんが、内部で何が起こっているのか知りたいです。

4

2 に答える 2

0

tbcとして設定する必要がありますrootViewController

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:tbc];   
[[self window] addSubview:tbc.view]; 
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
于 2013-01-23T14:16:20.447 に答える
0

タブ バー コントローラーに vc を追加すると、そのコントローラーの子になります。ウィンドウのルート ビュー コントローラーを子にすることはできないため、このエラーが発生します。vc を全画面表示にしたい場合は、それをタブ バー コントローラーに配置しないでください。その後、ある時点で、ウィンドウのルート ビュー コントローラーをタブ バー コントローラーに切り替えます (それが必要な場合)。

あなたは vc を何に使いたいか言っていません。使用方法によっては、タブ バー コントローラーの最初のタブにあるコントローラーから (画面全体を使用するように) モーダルに表示することをお勧めします。これを viewDidAppear から行うと、アプリの起動時にユーザーが最初に目にするものになります。

于 2013-01-23T17:00:18.213 に答える