6

Ich frage mich, wie NavController von AppDelegate = [[UIApplication sharedApplication] delegate] in der iPhone-Programmierung zu bekommen. z. B. in einem anderen ViewController, wo wir auf das AppDelegate verweisen.So erhalten Sie navController von AppDelegate.

Im applicationDelegate.h haben wir:

UINavigationController *navController; 

und die folgenden in applicationDelegate.m

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

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

Gibt es trotzdem die NavController aus dem Hauptfenster zu bekommen:

UIWindow *mainWindow = [appDelegate window]; 
+1

Warum machen Sie den Nav-Controller nicht zu einer Eigenschaft Ihres App-Delegierten? –

+0

Ich brauche die Informationen über den navController nur über das mainWindow (UIWindow * mainWindow = [appDelegate window]), das ist möglich. – ramo

+0

Ich nehme an, nein. Aber warum können Sie den App-Delegierten nicht wirklich verwenden? –

Antwort

17

Wenn diese anderen UIViewController in der UINavigationController enthalten ist, können Sie einfach anrufen:

UINavigationController *navController = self.navigationController; 

vom UIViewController.

Andernfalls können Sie UINavigationController als eine Eigenschaft in der AppDelegate festlegen.

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

zugreifen Dann appDelegate.navController.

Oder Sie das UINavigationController als Fensters des RootViewController einstellen:

[window setRootViewController:navController]; 

und rufen von überall:

UINavigationController *navController = window.rootViewController; 
+0

Sehr lehrreich! Vielen Dank! Eine Frage: Wenn Sie über 'window' auf den navController zugreifen wollen, müssen Sie nicht über die UIApplication zugreifen? Gibt es vielleicht einen kürzeren Weg? – JohnK

+0

Sie können von jedem UIView mit der Eigenschaft 'window' zum Fenster gelangen. – Lucien

1

Sie können die navController als eine Eigenschaft Ihrer Delegate-Klasse machen. Beispiel unten:

In applicationDelegate.h

@property (retain, nonatomic) UINavigationController *navController; 

In applicationDelegate.m

@synthesize navController; 

dann können Sie den folgenden Code verwenden, um die NavController in anderen Klassen zu erhalten (Angenommen, Ihre Stellvertretung Klasse ist MyApplicationDelegate):

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

Sie können den navCo machen ntroller eine Eigenschaft

@property (nonatomic,strong) UINavigationController *navController; 

Dann Zugriff nur aus Ihrem AppDelegate

appDelegate.Controller 
-1

Wenn Sie beginer und Lernenden, die Navigationssteuerung in gesamter Anwendung gemeinsam genutzt wird, die gerade vorbereitet wird den „Stapel“ von Ihrer App viewcontrollers, so können Sie den Navigationscontroller in jedem Viewcontroller (nur wenn dieser Controller gedrückt wurde) auf die App zugreifen. Wenn Sie einen Controller drücken, wird er zum "Stack" des Navigationscontrollers hinzugefügt.

Sie können mit dem Selbstobjekt dieses Viewcontrollers auf den Navigationscontroller zugreifen.

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

Durchlaufen mit dem Link wird vollständige Kenntnis der Navigation Anatomie geben.

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

1

Keine zusätzlichen Eigenschaften benötigt, verfügbar fast überall in der Anwendung dieser Makro Definition:

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

Wenn Sie das Makro an der Spitze von Ihnen setzen r Source oder in einer .h-Header-Datei, die Sie in Ihre Quelle importieren, können Sie mit mainNavController beginnen, als wäre es eine lokale Variable.

Zum Beispiel:

[mainNavController pushViewController:myViewController animated:YES]; 

oder ohne Makro, direkt in den Code ein:

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

Sie diesen Code fast überall verwenden können, was sehr praktisch ist, wenn man in einer Klasse arbeiten und Sie können nicht direkt auf einen ViewController zugreifen.

Verwandte Themen