2014-09-05 132 views
-1

瞬間呈現LoginViewController在我的appdelegate我tabbarcontrollerLoginview TabBarController

我試圖用這個代碼塊之前,也命名組合導航控制器身份 「登錄」

UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController; 
UINavigationController *logincontroller=[storyboard instantiateViewControllerWithIdentifier:@"log"]; 
[tabBarController presentViewController:logincontroller animated:YES completion:NULL]; 

警告:嘗試呈現其視圖不在窗口層次結構中的視圖!

請有任何想法。

回答

0

你必須使用self.window.rootViewController當你在appDelegate

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
LoginViewController *logincontroller= [storyboard instantiateViewControllerWithIdentifier:@"log"]; 
[self.window.rootViewController presentViewController:logincontroller animated:NO completion:nil]; 

我不認爲你明白我想指出,你正在使用UINavigationController,但UINavigationController類實現了一個專門的視圖管理分層內容導航的控制器。您正嘗試以模態方式呈現登錄視圖,因此它不是導航堆棧的一部分。

您應該尋找LoginViewController並使用其故事版ID創建它的新實例。

0

您是否試圖在applicationDidFinishLaunching中顯示LoginViewcontroller:?那時,根視圖控制器還沒有出現,所以它還不在窗口層次結構中。有三件事你可以做。其中,使其出現在applicationDidBecomeActive:

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 

    UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
    UINavigationController *controller = [storyboard instantiateViewControllerWithIdentifier:@"navigationForLog"]; 
    [self.window.rootViewController presentViewController:controller animated:YES completion:nil]; 
} 

或者,你可以把它從使用TabBar控制器的viewDidAppear出現。這假定你有一個自定義標籤欄控制器。

在MyCustomTabBarController.m:

-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
    UINavigationController *controller = [storyboard instantiateViewControllerWithIdentifier:@"navigationForLog"]; 
    [self presentViewController:controller animated:YES completion:nil]; 
} 

這些解決方案將首先顯示根視圖控制器的兩個,然後模態推日誌的ViewController。如果您希望它立即顯示,請將動畫:YES更改爲動畫:NO。

另一種可以做到這一點的方法是讓你的登錄是一個根視圖控制器。如果用戶尚未登錄,則不應該有一個TabBar控制器,因爲它可能會嘗試加載不可用的內容。如果是這樣的話,你應該從故事板中的一個登錄控制器開始。如果登錄成功,您可以將tabbar放在登錄名的頂部(而不是在tabbar頂部登錄),或者您可以將rootviewcontroller替換爲登錄控制器。

編輯1:

當呈現在另一個的頂部上的模態視圖控制器,爲了使新的控制器有一個導航控制器,你必須與它一起呈現導航控制器。這是你應該有的故事板。第一個視圖是你的標籤控制器。當您確定用戶需要登錄時,預設其roo​​tViewController是您的loginController的UINavigationController。

enter image description here

編輯2:

我調整我的故事板,以便登錄控制器沒有得到通過導航欄覆蓋。您必須在右側窗格中取消設置擴展邊緣:在頂部條塊下。另外,您可以直接在故事板中的導航欄上添加後退/關閉按鈕。

enter image description here

編輯3:

注意,控制器應該出現在applicationDidBecomeActive:是導航控制器。我顯示的示例登錄控制器什麼都不做,並且您應該爲按鈕添加其他功能等。當您實例化並顯示導航控制器時,它將顯示它擁有的任何rootViewController(在本例中爲您的登錄控制器)以及導航酒吧。

+0

第一解決方案工作但它不顯示我的導航欄控制器 – m34 2014-09-05 13:14:01

+0

啊,原因是導航控制器屬於登錄控制器,登錄完成後,有一個在新的堆棧中沒有導航控制器。 – mitrenegade 2014-09-05 13:14:45

+0

對不起,我真的不明白你在說什麼@mintrenegade對不起 – m34 2014-09-05 13:19:30