2011-10-20 6 views
0

私のプロジェクトは、開始するビューベースのプロジェクトです。非ルートビューにUINavbarControllerとTabbarControllerを追加する

したがって、アプリのデリゲートは通常通りに開始されます。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window.rootViewController = self.viewController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

その後、私の最初のViewControllerが呼び出され、ユーザーが自分の資格情報を入力してログオンすることができますので、それは2 UITextFieldsを示しています。

これが成功すると、別のビューコントローラが呼び出され、UINavigationControllerとUITabBarControllerがビューに追加されます。以下に示すように。

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 

UINavigationController *localNavigationController; 
tabBarController = [[UITabBarController alloc] init]; 
NSMutableArray *localControllersArray = [[NSMutableArray alloc] initWithCapacity:2]; 


Hello *firstViewController; 
firstViewController = [[Hello alloc] init]; 
localNavigationController = [[UINavigationController alloc] initWithRootViewController:firstViewController]; 
[localNavigationController.tabBarItem initWithTitle:@"Test" image:[UIImage imageNamed:@"tabBarIcon.png"] tag:1]; 
//[localNavigationController.tabBarItem initWithTabBarSystemItem:UITabBarSystemItemDownloads tag:1]; 
[email protected]"New Requests"; 

[localControllersArray addObject:localNavigationController]; 
[localNavigationController release]; 
[firstViewController release]; 


Test *secondViewController; 
secondViewController = [[Test alloc] init]; 
localNavigationController = [[UINavigationController alloc] initWithRootViewController:secondViewController]; 
[localNavigationController.tabBarItem initWithTitle:@"Test" image:[UIImage imageNamed:@"tabBarIcon.png"] tag:2]; 
[email protected]"Existing"; 


[localControllersArray addObject:localNavigationController]; 
[localNavigationController release]; 
[secondViewController release]; 


// load up our tab bar controller with the view controllers 
tabBarController.viewControllers = localControllersArray; 

// release the array because the tab bar controller now has it 
[localControllersArray release]; 


// add the tabBarController as a subview in the window 
[self.view addSubview:tabBarController.view]; 

} 

これはこれまでのところうまくいくようです。ステータスバーの高さによってNavbarとTabbarの両方が低くなる問題がありましたが、ステータスバーを隠すと修正されました。

このようにしてはならない理由はありますか?それは悪い習慣か、私は道に沿っていくつかの問題に遭遇するでしょうか?

アプリデリゲートからNavbarとTabbarの両方を設定して、ログオン画面の両方でNavbarとTabbarを非表示にすることができます。それは私が見る唯一の他の選択肢です。

皆様からのご意見をお待ちしております。私がこれまでにしたことの結果については緊張しています。

多くのおかげで、 -code

答えて

0

あなたは、一般的に直接独自のビューコントローラのサブビューとしてUINavigationControllerUITabBarControllerのビューを追加しないでください。このような「View Controller Containment」は、新しいiOS 5 APIを使用しない限り難しくなります。

実際のビューコントローラでは、viewDidAppear:やローテーションメッセージなどの重要なメッセージは受信されません。奇妙なローテーションバグやその他の奇妙な問題が発生することに気づくでしょう。親ビューコントローラからこれらのメソッドを転送することはできますが、問題はありませんが、標準のタブバーコントローラを表示しようとしているので、これを行う必要はありません。

一般に、UIWindowのルートビューコントローラとして1つのビューコントローラを設定する必要があります。これは通常、UINavigationController,UITabBarControllerなどです。親UIWindowは、回転イベントと他のメッセージをこのコントローラに送信します。 UITabBarControllerのような標準の「コンテナ」コントローラは、これらのメッセージを子に転送して、すべてが正しく動作するようにします。

私があなたの場合は、常にウィンドウのルートビューコントローラーとしてタブバーコントローラーを使用します。あなたのアプリが(すなわちapplication:didFinishLaunchingWithOptions:で)起動すると、空のタブバーコントローラを作成し、ルートビューコントローラとしてそれを設定:今

- (BOOL)application:(UIApplication *)application 
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // create a basic empty tab bar controller 
    self.tabBarController = [[[UITabBarController alloc] init] autorelease]; 
    // ... 

    // Set up the window's root view controller 
    self.window.rootViewController = tabBarController; 

    // ... 
} 

、あなたが画面上に存在もの、それはの子でなければなりませんいつでもルートビューコントローラ、あなたの場合はタブバーコントローラです。

ルートビューコントローラが設定されたら、ユーザがすでにログインしているかどうかを確認することができます。そうであれば、ナビゲーションコントローラとタブ項目を設定してタブに追加できますバーコントローラ。

ユーザーがログインしていない場合は、presentModalViewController:animated:を使用してタブバーコントローラの上、ログイン・ビュー・コントローラを表示することができますが:

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

    // Set up the window's root view controller 
    self.window.rootViewController = tabBarController; 

    if (isUserLoggedIn()) { 
     [self setupTabsAndStuff]; 

    } else { 
     LoginViewController *loginVC = [[[LoginViewController alloc] init] autorelease]; 
     [self.tabBarController presentModalViewController:loginVC animated:NO]; 
    } 

    // ... 
} 

animated:NOは、ログイン画面が起動した後すぐに表示されますアニメーションなしのアプリ。

ユーザーが正しい詳細を入力すると、再度setupTabsAndStuffメソッドを呼び出すことができ、ログインビューコントローラをもう一度閉じることができます。

だから要約する:

  • むしろあなたは、タブバーのコントローラのビューを置くだけで、直接タブバーコントローラを使用してその中に、独自のUIViewControllerを持つより。
  • タブバーコントローラをウィンドウのルートビューコントローラとしてインストールします。タブバーコントローラは、それに含まれるビューコントローラに回転イベントやその他の特別なメッセージを正しく転送します。
  • 常にビューとコントローラをルートビューコントローラの子として表示します。何かをフルスクリーンで使用する必要がある場合presentModelViewController:animated
0

は* tabBarControllerの枠を設定するようにしてください。

[tabBarController.view setFrame:self.view.bounds]; 

// add the tabBarController as a subview in the window 
[self.view addSubview:tabBarController.view]; 
関連する問題