84

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

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

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

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

4

4 回答 4

204

对于我需要在应用程序的任何位置访问它的变量(通常是模型数据结构),请在您的 AppDelegate 类中声明它们。当你需要引用它时:

YourAppDelegate *appDelegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate];
//and then access the variable by appDelegate.variable 
于 2008-10-24T03:14:31.407 回答
16

如果我理解您的问题,您想在 AppDelegate 对象中引用成员变量/属性吗?最简单的方法是使用 [[UIApplication sharedApplication] delegate] 返回对您的对象的引用。

如果你有一个名为 window 的属性,你可以这样做:

UIWindow   *mainWindow = [[[UIApplication sharedApplication] delegate] window];
//do something with mainWindow
于 2008-10-23T23:51:59.443 回答
11

这是 iOS4.0 及更高版本定义明确的便携式替代方案:

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

或者,在一行中,

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

不要忘记设置窗口的rootViewController属性(比如在 IB 中),否则会出现问题。

于 2011-02-27T11:13:34.117 回答
2

定义一个宏并在任何地方使用它!

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

在我的代码中:-

UIViewController *rootViewController = appDelegateShared.window.rootViewController;
于 2016-12-23T10:31:13.467 回答