2013-08-22 18 views
9

W scenorysie mam kontroler widoku wprowadzającego, który zanika do kontrolera UINavigationController.Pobierz UINavigationController zdefiniowany przez storyboard z AppDelegate

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

chciałbym uzyskać odniesienie do kontrolera nawigacji z App delegata (jak odpowiedź @Guillaume robi w this question).

Oto jak próbuję uzyskać do niego dostęp:

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

Ale kontroler nawigacyjny jest zerowa.

Jakiekolwiek pojęcie, dlaczego navController jest zerowe lub co mogę zrobić, aby uzyskać odniesienie do niego?

+0

Czy ustawić identyfikator Storyboard dla swojego UINavigationController? Jeśli nie, powinieneś to zrobić w swojej Storyboard. Po tym wszystkim nie potrzebujesz tego, aby uzyskać dostęp do kontrolera nawigacyjnego. Po prostu potrzebujesz [self.storyboard instantiateViewControllerWithIdentifier: @ "myID"]. Zakładam, że dzwonisz do tego z kontrolera widoku. Aby uzyskać dostęp do kontrolera nawigacyjnego, jaki chciałeś, byłby to możliwe tylko wtedy, gdy twój rootViewController byłby w UINavigationController. – rocir

+0

Dzięki @rocir! To wygląda obiecująco. Jedynym moim zastrzeżeniem jest to, że powinienem już utworzyć instancję UINavigationController i chciałbym uzyskać odniesienie do tego. Nie sądzę, żebym chciał utworzyć drugi kontroler nawigacyjny. – bbrame

+0

Ale w ten sposób nie zrobisz tego, ponieważ twój rootViewController nie znajduje się wewnątrz kontrolera UINavigationController. Również w tym momencie UIViewController nie został jeszcze utworzony. Czy masz jakieś przejście między tymi dwoma kontrolerami widoku? – rocir

Odpowiedz

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

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

Określasz identyfikator kontrolera swojego kontrolera nawigacyjnego w kontrolerze atrybutów kontrolera nawigacyjnego.

+0

Jest w "Inspektorze tożsamości" (3 od lewej). – Ali

+2

spowoduje to zwrócenie nowej instancji kontrolera nawigacyjnego za każdym razem, gdy dokładnie nastąpi –

+0

@MohamedElkassas. Pobranie dowolnego kontrolera z storyboardu za każdym razem "tworzy nowy" obiekt. nie ma czegoś takiego jak "udostępniona instancja" z storyboardu. jeśli chcesz taką współużytkowaną instancję, powinieneś ją najpierw utworzyć w appdelegate, a następnie uzyskać do niej dostęp z dowolnego miejsca w aplikacji za pośrednictwem appdelegate. –

2

Rozwiązanie Arsena wygląda ładnie, ale nie wiedziałem, jak zdobyć nazwę mojego storyboardu. Co pracował dla mnie było

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 

Pierwsze referencyjne NavigationController w sprawie AppDelegate może wydawać się złe praktyki kodowania, ale w moim przypadku potrzebne, bo to jest, gdy

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

znajduje się, co jest jedna z metod wywoływanych po otrzymaniu powiadomienia. Ja też walczyli o jak zaktualizować kontroler nawigacyjny raz dostałem wiadomość, więc może nie na temat, ale tutaj jest darmowa wskazówka:

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

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

[navigationController popToViewController:dashBoardViewController animated:YES]; 

Nadzieję, że to pomaga!

Powiązane problemy