2013-08-22 65 views
9

在故事板中,我有一個介紹性視圖控制器,該控制器會淡入UINavigationController。從AppDelegate獲取故事板定義的UINavigationController

 | |  | | 
    -> | | -> | |  
     | |  | | 
    ViewCtrl NavCtrl 

我想獲得從應用委託給導航控制器的引用(在this question像@Guillaume答案一樣)。

以下是我正在嘗試訪問它:

UIApplication.sharedApplication.delegate.window.rootViewController.navigationController; 

但導航控制器是零。

任何想法爲什麼navController是零或我能做些什麼來得到它的參考?

+0

您是否爲您的UINavigationController設置了Storyboard ID?如果不是,你應該在Storyboard中做到這一點。之後,您不需要全部訪問您的導航控制器。你只需要[self.storyboard instantiateViewControllerWithIdentifier:@「myID」]。我假設你從你的視圖控制器調用。要想像你想要的那樣訪問導航控制器,只有當你的rootViewController在UINavigationController中時纔有可能。 – rocir

+0

謝謝@rocir!那看起來很有希望我唯一的反對意見是應該已經有一個UINavigationController實例化了,我想獲得一個參考。我不認爲我想要實例化第二個導航控制器。 – bbrame

+0

但是這樣做你不會做到這一點,因爲你的rootViewController不在UINavigationController中。此外,在這一點上,UIViewController尚未實例化。所以你有任何連接這兩個視圖控制器的segue? – rocir

回答

23
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" 
                 bundle: nil]; 

UINavigationController *controller = (UINavigationController*)[mainStoryboard 
        instantiateViewControllerWithIdentifier: @"<Controller ID>"]; 

您可以在導航控制器的屬性檢查器中爲導航控制器指定控制器標識符。

+0

它在「身份檢查員」(左三)中。 – Ali

+2

這將每次返回導航控制器的新實例 –

+0

@MohamedElkassas。從故事板獲取任何控制器是每次「實例化」新對象。故事板上沒有「共享實例」這樣的東西。如果你想要這樣的共享實例,你應該在appdelegate上實例化一次,然後通過appdelegate從應用程序中的任何地方訪問它。 –

2

所以阿森的解決方案看起來不錯,但我不知道如何得到我的故事板的名稱哈哈。什麼工作對我來說是

UINavigationController *navigationController = (UINavigationController*)_window.rootViewController; 
AVDashboardViewController *dashBoardViewController = 
(AVDashboardViewController*)[navigationController.viewControllers objectAtIndex:1];//since on index 0 I have my login screen and index 1 is the home screen 

獲取NavigationController的在AppDelegate中引用似乎是不好的編碼習慣,但對我來說,我需要它,因爲它是在

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 

所在,這是接收通知時調用的方法之一。我也掙扎如何,一旦我得到的消息更新導航控制器,所以也許題外話,但這裏是一個免費的提示:

UIBarButtonItem *notiButton = [[UIBarButtonItem alloc] initWithTitle: @"Received push!" style: UIBarButtonItemStyleBordered target:self action:nil]; 

[[dashBoardViewController navigationItem] setLeftBarButtonItem:notiButton animated:YES]; 

[navigationController popToViewController:dashBoardViewController animated:YES]; 

希望它能幫助!

相關問題