Ссылка на переменные экземпляра 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), иначе это подействует.


2

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

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

В моем коде: -

UIViewController *rootViewController = appDelegateShared.window.rootViewController;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.