如何从我的视图控制器引用我的 App Delegate 中的 managedObjectContext?

Posted

技术标签:

【中文标题】如何从我的视图控制器引用我的 App Delegate 中的 managedObjectContext?【英文标题】:How do I reference the managedObjectContext in my App Delegate from my View Controller? 【发布时间】:2010-02-15 03:15:40 【问题描述】:

我知道还有其他问题涉及此主题,但似乎没有一个完全符合我的经历,因此提出了新问题。

我有一个 UITabBarController 应用,我定义了两个子视图

两个选项卡在 Identity Inspector 中的 Class 属性都设置为 UINavigationController。

两个子视图都是 UIViewController 类并包含 MKMapView 对象。

我正在尝试将 Core Data 与我可以使用 Core Data 存储有关我想要放置在地图上的对象的信息的目标集成。

我在我的 Delegate 头文件中将我的 UITabBarController 定义为“rootController”。 我还在那里定义了 managedObjectModel、managedObjectContext 和 persistentStoreCoordinator 属性。

在 Delegate 实现中,我有上述属性的标准访问器方法,并且我有 rootController 定义如下:

- (void)applicationDidFinishLaunching:(UIApplication *)application 

[window addSubview:rootController.view];
[window makeKeyAndVisible];


在子视图的视图控制器中,我定义了 managedObjectContext 并合成了它。

现在我的问题是,我无法让编译器允许我从视图控制器引用 App Delegate 中的 managedObjectContext。

我在 applicationDidFinishLaunching 方法中尝试了以下操作:

firstView.managedObjectContext = self.managedObjectContext;

但我只是收到以下错误:

Accessing unknown 'setManagedObjectContext:' class method

谁能帮我解决这个问题?

谢谢


更新:

为了补充我的问题,我将通过提供更多细节来避免一些答案

我的 appdelegate.h 文件中有一个 @Class 声明 我的 appdelegate.m 文件中有一个 #import 语句,用于 firstView.h 文件 我在 appdelegate.h 文件中声明了我的 firstView,如下所示

FirstView *firstView;

【问题讨论】:

其实我发现了一个错字。我在 firstView.managedObjectContext 语句中引用了 Class 而不是实例。现在编译没有错误。谢谢@Gerry3 是的,您收到的错误消息说“类方法”很奇怪,所以我想知道您如何使用该类而不是该类的实例。很高兴你成功了。 【参考方案1】:

firstView 是如何声明和分配的?

它应该是对具有名为“managedObjectContext”属性的对象的引用。

【讨论】:

Firstview 是一个 uiview 控制器。 Mamagedobjectcontext 是 uiviewController 的一个属性 @Gerry3 你的意思是它是如何在委托中定义的? 是的,它是声明为 UIViewController 还是正确地声明为实际具有该属性的 UIViewController 的自定义子类? @Gerry3 对我的 FirstView 代码的唯一引用是通过委托标头中的 @Class 声明。我是否需要从 FirstView 导入头文件才能引用其 managedObjectContext 属性? 嗯,我前面没有源代码@Gerry3。我已经在委托实现文件中导入了我的 firstView.h 文件。还有其他想法吗?【参考方案2】:

我遇到了同样的问题,我会分享我的解决方案。

首先,您需要在 nib 文件的选项卡栏中引用导航控制器,确保将其连接起来。

IBOutlet UINavigationController *navigationController;

然后,按照支持文档中的建议获取 Controller 并将 managedObjectContext 发送给它:

SavedTableViewController *saved = (SavedTableViewController *)[navigationController topViewController];
saved.managedObjectContext = self.managedObjectContext;

Alex(来自另一篇文章)是对的,“您通常应该远离从应用程序委托获取共享对象。这使得它的行为太像一个全局变量,并且与之相关的问题一团糟。 "

【讨论】:

如果你只使用一个视图控制器来修改对象,而其他视图控制器来查看,那么共享对象肯定不是什么大问题吗? 您说得很好,但是如果您将来添加另一个视图控制器,它也将访问它怎么办?或者您想重组您的应用程序?这种方法更多的是关于未来的打样,并确保您不会遇到不必要的问题。 CD 旨在让应用程序委托将上下文提供给控制器,而不是相反。这不是我对理想实现的想法,但这是工程师推荐的,只是传递信息..

以上是关于如何从我的视图控制器引用我的 App Delegate 中的 managedObjectContext?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取对子视图的 rootViewController 的引用?

如何从我的主视图控制器访问 UIView 中的 let 语句?

如何从app delegate访问NSViewController?

引用 AppDelegate 时出错

如何将消息从我的存储库类返回到我的控制器,然后返回到我在 asp.net-mvc 中的视图?

iOS - 从外部类引用活动故事板视图控制器