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

84

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

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

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

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

Крис Хэнсон
источник

Ответы:

204

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

YourAppDelegate *appDelegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate];
//and then access the variable by appDelegate.variable 
Леонхо
источник
7
Я проголосовал за это, потому что вы добавили приведение, вам нужно привести AppDelegate к своему собственному типу, чтобы вы могли видеть свои собственные свойства, которые вы установили. Вы можете отредактировать, чтобы сделать это более ясным, не выполняя преобразование в "AppDelegate", хотя ...
Кендалл Хельмштеттер Гелнер,
Есть ли способ получить доступ к корневому контроллеру представления без ссылки на имя делегата приложения или любого из его членов? (Я бы хотел написать переносимый код, которому нужен контроллер корневого представления.)
SK9,
SK9, каждое приложение iOS должно иметь appDelegate, поэтому код будет переносимым!
Daniel
16

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

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

UIWindow   *mainWindow = [[[UIApplication sharedApplication] delegate] window];
//do something with mainWindow
Бен Готтлиб
источник
11

Вот хорошо продуманная портативная альтернатива для iOS 4.0 и выше:

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

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

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

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

SK9
источник
2

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

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

В моем коде: -

UIViewController *rootViewController = appDelegateShared.window.rootViewController;
попробуйтеKuldeepTanwar
источник