Referencing AppDelegate instance variables

IphoneCocoa Touch

Iphone Problem Overview


I have a project that is based on the Navigation Based Application template. In the AppDelegate are the methods -applicationDidFinishLoading: and -applicationWillTerminate:. In those methods, I am loading and saving the application data, and storing it in an instance variable (it is actually an object-graph).

When the application loads, it loads MainWindow.xib, which has a NavigationConroller, which in turn has a RootViewController. The RootViewController nibName property points to RootView (my actual controller class).

In my class, I wish to refer to the object that I created in the -applicationDidFinishLoading: method, so that I can get a reference to it.

Can anyone tell me how to do that? I know how to reference between objects that I have created programmatically, but I can't seem to figure out to thread my way back, given that the middle step was done from within the NIB file.

Iphone Solutions


Solution 1 - Iphone

For variables (usually the model data structure) which I need to access it anywhere in the app, declare them in your AppDelegate class. When you need to reference it:

YourAppDelegate *appDelegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate];
//and then access the variable by appDelegate.variable 

Solution 2 - Iphone

If I understand your question, you want to reference member variables/properties in your AppDelegate object? The simplest way is to use [[UIApplication sharedApplication] delegate] to return a reference to your object.

If you've got a property called window, you could do this:

UIWindow   *mainWindow = [[[UIApplication sharedApplication] delegate] window];
//do something with mainWindow

Solution 3 - Iphone

Here's a well defined portable alternative for iOS4.0 and up:

UIApplication *myApplication = [UIApplication sharedApplication];
UIWindow *mainWindow = [myApplication keyWindow];
UIViewController *rootViewController = [mainWindow rootViewController];

or, in one line,

UIViewController *rootViewController = [[[UIApplication sharedApplication] keyWindow] rootViewController];

Don't forget to set the window's rootViewController property (say in IB) or this will do jack.

Solution 4 - Iphone

Define a macro and use it anywhere!

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

In My Code:-

UIViewController *rootViewController = appDelegateShared.window.rootViewController;

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestioncdeerinckView Question on Stackoverflow
Solution 1 - IphoneleonhoView Answer on Stackoverflow
Solution 2 - IphoneBen GottliebView Answer on Stackoverflow
Solution 3 - IphoneSK9View Answer on Stackoverflow
Solution 4 - IphonetryKuldeepTanwarView Answer on Stackoverflow