Ссылка на переменные экземпляра AppDelegate

У меня есть проект, основанный на шаблоне приложения на основе навигации. В AppDelegate используются методы -applicationDidFinishLoading: и -applicationWillTerminate:. В этих методах я загружаю и сохраняю данные приложения и сохраняю его в переменной экземпляра (на самом деле это объект-граф).

Когда приложение загружается, оно загружает MainWindow.xib, у которого есть NavigationConroller, который, в свою очередь, имеет RootViewController. Свойство RootViewController nibName указывает на RootView (мой фактический класс контроллера).

В моем классе я хочу обратиться к объекту, который я создал в методе -applicationDidFinishLoading:, чтобы я мог получить ссылку на него.

Может ли кто-нибудь сказать мне, как это сделать? Я знаю, как ссылаться между объектами, которые я создал программным путем, но я не могу понять, что мне нужно обращать свой путь назад, учитывая, что средний шаг был сделан из файла NIB.

Ответ 1

Для переменных (как правило, структуры данных модели), которые мне нужно получить в любом месте приложения, объявите их в своем классе AppDelegate. Когда вам нужно будет ссылаться на него:

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

Ответ 2

Если я понимаю ваш вопрос, вы хотите ссылаться на переменные-члены/свойства в объекте AppDelegate? Самый простой способ - использовать делегат [[UIApplication sharedApplication]], чтобы вернуть ссылку на ваш объект.

Если у вас есть свойство, называемое окном, вы можете сделать это:

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

Ответ 3

Здесь определенно переносимая альтернатива для iOS4.0 и выше:

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

или, в одной строке,

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

Не забудьте установить свойство window rootViewController (скажем, в IB), или это сделает джек.

Ответ 4

Я определяю макрос и использую его так: -

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

В моем коде: -

appDelegateShared.myVariable=anotherVariable;