2013-08-22 20 views
9

Nello storyboard, ho un controller di visualizzazione introduttivo che sfuma ad un UINavigationController.Ottieni UINavigationController definito da storyboard da AppDelegate

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

vorrei ottenere un riferimento al controller di navigazione dal delegato app (come la risposta @Guillaume fa in this question).

Ecco come sto cercando di accedervi:

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

Ma il controller di navigazione è pari a zero.

Qualche idea sul perché navController è nullo o cosa posso fare per ottenere un riferimento ad esso?

+0

Hai impostato l'ID Storyboard per UINavigationController? In caso contrario, dovresti farlo nello Storyboard. Dopodiché, non hai bisogno di tutto ciò per accedere al tuo controller di navigazione. Avresti solo bisogno di [self.storyboard instantiateViewControllerWithIdentifier: @ "myID"]. Sto assumendo la tua chiamata dal tuo controller di visualizzazione. Per accedere a un controller di navigazione come desiderato, ciò sarebbe possibile solo se il tuo rootViewController fosse all'interno di un UINavigationController. – rocir

+0

Grazie a @rocir! Sembra promettente. La mia unica obiezione è che dovrebbe esserci già un UINavigationController istanziato, e mi piacerebbe avere un riferimento a quello. Non penso di voler istanziare un secondo controller nav. – bbrame

+0

Ma in questo modo non lo farai perché il tuo rootViewController non si trova all'interno di un UINavigationController. Inoltre, a questo punto, UIViewController non è stato ancora istanziato. Quindi hai qualche seguito che collega questi due controller di vista? – rocir

risposta

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

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

Specificare l'identificatore del controller per il controller di navigazione nella finestra di ispezione attributi del controller di navigazione.

+0

È in "Identity Inspector" (3 ° da sinistra). – Ali

+2

questo restituirà una nuova istanza del controller di navigazione ogni volta –

+0

@MohamedElkassas esattamente. ottenere qualsiasi controller dallo storyboard è "istanziare" ogni volta un nuovo oggetto. non esiste "istanza condivisa" dallo storyboard. se vuoi tale istanza condivisa, devi istanziarla una volta su appdelegate e quindi accedervi da qualsiasi punto della tua app tramite appdelegate. –

2

Quindi la soluzione di Arsen sembra carina ma non sapevo come ottenere il nome del mio storyboard lol. Che cosa ha funzionato per me è stato

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 

Ottenere riferimento del navigationController sulla AppDelegate potrebbe sembrare codifica pratica male, ma nel mio caso ho avuto bisogno perché è dove si trova il

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

, che è uno dei metodi chiamati quando viene ricevuta una notifica. Ho anche lottato su come aggiornare il controller di navigazione una volta ho avuto il messaggio, quindi forse fuori tema, ma qui è una punta libera:

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

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

[navigationController popToViewController:dashBoardViewController animated:YES]; 

Speranza che aiuta!

Problemi correlati