Ссылка на переменные экземпляра 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;