Посилання на змінні екземпляра 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", хоча ...
Kendall Helmstetter Gelner

Чи є спосіб отримати доступ до кореневого контролера перегляду, не посилаючись на ім'я делегата програми або будь-якого з його членів? (Я хотів би написати якийсь портативний код, який потребує кореневого контролера перегляду.)
SK9,

SK9, кожна програма iOS повинна мати appDelegate, тому код буде портативним!
Даніель

16

Якщо я розумію ваше запитання, ви хочете посилатися на змінні / властивості членів у своєму об’єкті AppDelegate? Найпростіший спосіб - використовувати [[UIApplication sharedApplication] делегат], щоб повернути посилання на ваш об’єкт.

Якщо у вас є властивість під назвою window, ви можете зробити це:

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

11

Ось чітко визначена портативна альтернатива для iOS4.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.