引用AppDelegate实例变量


84

我有一个基于基于导航的应用程序模板的项目。在AppDelegate中是方法-applicationDidFinishLoading:-applicationWillTerminate:。在这些方法中,我正在加载和保存应用程序数据,并将其存储在一个实例变量中(它实际上是一个对象图)。

当应用程序加载时,它将加载MainWindow.xib,它具有一个NavigationConroller,而后者又具有一个RootViewController。RootViewControllernibName属性指向RootView(我的实际控制器类)。

在我的课堂上,我希望引用在-applicationDidFinishLoading:方法中创建的对象,以便获得对它的引用。

谁能告诉我该怎么做?我知道如何在我以编程方式创建的对象之间进行引用,但是鉴于中间步骤是在NIB文件中完成的,因此我似乎无法弄清楚如何回溯。

Answers:


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,因此代码可移植!
丹尼尔(Daniel)

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;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.