Ссылка на переменные экземпляра AppDelegate - PullRequest
84 голосов
/ 24 октября 2008

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

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

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

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

Ответы [ 4 ]

204 голосов
/ 24 октября 2008

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

YourAppDelegate *appDelegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate];
//and then access the variable by appDelegate.variable 
16 голосов
/ 24 октября 2008

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

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

UIWindow   *mainWindow = [[[UIApplication sharedApplication] delegate] window];
//do something with mainWindow
11 голосов
/ 27 февраля 2011

Вот четко определенная портативная альтернатива для iOS4.0 и выше:

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

или в одну строку

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

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

2 голосов
/ 23 декабря 2016

Определите макрос и используйте его где угодно!

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

В моем коде: -

UIViewController *rootViewController = appDelegateShared.window.rootViewController;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...