6

Zastanawiam się, jak uzyskać navController z AppDelegate = [[UIApplication sharedApplication] delegate] w programowaniu iPhone'a. np. w innym viewController, gdzie odwołujemy się do AppDelegate.Jak uzyskać navController z AppDelegate.

W applicationDelegate.h mamy:

UINavigationController *navController; 

A tam idąc applicationDelegate.m

- (void)applicationDidFinishLaunching:(UIApplication *)application {  

    [window addSubview: navController.view]; 
    [window makeKeyAndVisible]; 
} 

Czy mimo to uzyskać navController z MainWindow:

UIWindow *mainWindow = [appDelegate window]; 
+1

Dlaczego nie uczynisz kontrolera nawigacyjnego właściwością delegata aplikacji? –

+0

Potrzebuję uzyskać informacje o navController tylko przez mainWindow (UIWindow * mainWindow = [appDelegate window]), nie jest możliwe. – ramo

+0

Przypuszczam, że nie. Ale dlaczego tak naprawdę nie możesz używać delegata aplikacji? –

Odpowiedz

17

Jeśli ten drugi UIViewController zawarty jest w UINavigationController, można po prostu zadzwonić:

UINavigationController *navController = self.navigationController; 

od UIViewController.

W przeciwnym razie można ustawić UINavigationController jako właściwość w AppDelegate.

// AppDelegate.h 
@property (nonatomic, strong) UINavigationController *navController; 

Następnie przejdź do appDelegate.navController.

Lub można ustawić UINavigationController jako okna rootViewController:

[window setRootViewController:navController]; 

i dzwonić z dowolnego miejsca:

UINavigationController *navController = window.rootViewController; 
+0

Bardzo pouczające! Dziękuję Ci! Jedno pytanie: jeśli zamierzasz uzyskać dostęp do navController poprzez 'okno', czy nie musisz uzyskać dostępu poprzez UIApplication? Czy jest może krótsza droga? – JohnK

+0

Możesz dostać się do okna z dowolnego UIView z właściwością 'window'. – Lucien

1

Możesz ustawić navController jako własność swojej klasy delegatów. próbka poniżej:

W applicationDelegate.h

@property (retain, nonatomic) UINavigationController *navController; 

W applicationDelegate.m

@synthesize navController; 

następnie można użyć poniższy kod aby otrzymać navController w innych klasach (zakładamy, że klasa delegata jest MyApplicationDelegate):

appDelegate = (MyApplicationDelegate*)[[UIApplication sharedApplication] delegate]; 
UINavigationController *navController = appDeleagte.navController 
2

Możesz wykonać navCo ntroller właściwość

@property (nonatomic,strong) UINavigationController *navController; 

Wtedy właśnie do niego dostęp z appdelegate

appDelegate.Controller 
-1

Jeśli jesteś początkujący i uczący się, kontroler nawigacyjny jest wspólna w całej aplikacji, który będzie po prostu przygotować „stos” swoich aplikacji viewcontroller, dzięki czemu można uzyskać dostęp do elementu navigationcontroller w dowolnej kontrolce viewcontroller (tylko jeśli ten kontroler został wciśnięty) przez całą aplikację. Po naciśnięciu dowolnego kontrolera zostanie dodany do "stosu" kontrolera nawigacyjnego.

Możesz uzyskać dostęp do kontrolera nawigacyjnego za pomocą własnego obiektu samego kontrolera view.

[self.navigationController pushViewController:detail animated:YES]; 

Przejście za pomocą łącza zapewni pełną znajomość anatomii nawigacji.

http://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/NavigationControllers.html

1

Bez dodatkowych właściwości potrzebne, dostępny niemal wszędzie w aplikacji przy użyciu tego makro definicję:

#define mainNavController (((AppDelegate*)[[UIApplication sharedApplication] delegate]).navController) 

Po umieszczeniu makra na górze r source lub w pliku nagłówkowym .h, który importujesz do swojego źródła, możesz zacząć używać mainNavController tak, jakby był zmienną lokalną.

Na przykład:

[mainNavController pushViewController:myViewController animated:YES]; 

lub bez makro, bezpośrednio w kodzie:

AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate]; 
appDelegate.navController; // do something with the navController 

Można wykorzystać ten kod w dowolnym miejscu, co jest przydatne, jeśli pracujesz wewnątrz klasy i nie można uzyskać bezpośredniego dostępu do ViewController.

Powiązane problemy