ramo
ramo

Reputation: 619

How to get navController from AppDelegate.

I am wondering, that how to get navController from AppDelegate = [[UIApplication sharedApplication] delegate] in the iPhone programming. e.g., in other viewController where we reference to the AppDelegate.

In the applicationDelegate.h we have:

UINavigationController *navController;

And the following in applicationDelegate.m

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

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

Is there anyway to get the navController from the mainWindow:

UIWindow *mainWindow = [appDelegate window];

Upvotes: 7

Views: 29714

Answers (5)

Lucien
Lucien

Reputation: 8393

If this other UIViewController is contained in the UINavigationController, you can simply call:

UINavigationController *navController = self.navigationController;

from the UIViewController.

Otherwise, you can set UINavigationController as a property in the AppDelegate.

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

Then access appDelegate.navController.

Or, you can set the UINavigationController as window's rootViewController:

[window setRootViewController:navController];

And call from anywhere:

UINavigationController *navController = window.rootViewController;

Upvotes: 18

Remco Nijhuis
Remco Nijhuis

Reputation: 134

No extra properties needed, available almost anywhere in your application using this macro definition:

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

When you put the macro at the top of your source or in a .h header file that you import into your source, then you can start using mainNavController as if it were a local variable.

For example:

[mainNavController pushViewController:myViewController animated:YES];

Or without the macro, directly in code:

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

You can use this code almost anywhere, which is handy if you're working inside a class and you can't access a ViewController directly.

Upvotes: 1

Otium
Otium

Reputation: 1098

You can make the navController a property

@property (nonatomic,strong) UINavigationController *navController;

Then just access it from your appdelegate

appDelegate.Controller

Upvotes: 2

Kuldeep
Kuldeep

Reputation: 2589

If you are beginer and learner, the navigation controller is shared in whole application which will just prepare the "stack" of your app's viewcontrollers, so you can access the navigationcontroller in any viewcontroller(Only if that controller has been pushed) through out the app. When you push any controller it will added to the "stack" of navigation controller.

You can access the navigation controller with the self object of that viewcontroller itself.

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

Go through with the link will give complete knowledge of navigation anatomy.

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

Upvotes: -1

tangqiaoboy
tangqiaoboy

Reputation: 1476

You can make the navController as a property of your delegate class. sample below:

In applicationDelegate.h

@property (retain, nonatomic) UINavigationController *navController;

In applicationDelegate.m

@synthesize navController;

then you can use the following code to get the navController in other classes (Assume your delegate class is MyApplicationDelegate):

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

Upvotes: 1

Related Questions