3

我正在使用 CoreData 并设置了NSManagedObjectContextinAppDelegate文件。

我需要在导航树中的许多级别的 ViewController 中获取 managedObjectContext。显然,我不想将它传递给所有的 init 方法。

我已经尝试过[[[UIApplication sharedApplication] delegate] managedObjectContext];,但我收到此错误“选择器'managedObjectContext'没有已知的实例方法

有人可以指导我如何获取 managedObjectContext吗AppDelegateViewContoller

4

2 回答 2

14

首先,您需要创建一个属性,AppDelegate.h如下所示:

@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext; // or strong if you ARC instead of retain

使用readonly防止您在外部修改上下文。

AppDelegate.m合成它像:

@synthesize managedObjectContext;

始终在AppDelegate.m覆盖 getter 方法之内

- (NSManagedObjectContext *)managedObjectContext
{    
    if (managedObjectContext != nil) return managedObjectContext;

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {

        managedObjectContext = [[NSManagedObjectContext alloc] init];
        [managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return managedObjectContext;
}

完成后,您将拥有一个managedObjectContext可以在任何地方访问的属性

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext* context = appDelegate.managedObjectContext;

一种更酷的方法可能是在您的类中创建一个类方法,AppDelegate.h如下所示:

+ (AppDelegate *)sharedAppDelegate;

然后AppDelegate.m执行以下操作:

+ (AppDelegate *)sharedAppDelegate
{
    return (AppDelegate *)[[UIApplication sharedApplication] delegate];
}

现在,在导入AppDelegate标题 ( #import "AppDelegate.h") 之前,您可以在任何地方执行以下操作:

AppDelegate* appDelegate = [AppDelegate sharedAppDelegate];
NSManagedObjectContext* context = appDelegate.managedObjectContext;

笔记

使用这种方法会导致您的应用程序变得僵化。为了克服这个问题,我建议您阅读Marcus Zarra的有关在 iPhone 上传递 nsmanagedobjectcontext 的文章。

希望能帮助到你。

于 2012-05-18T12:44:33.437 回答
2

您需要将全局 sharedApplication 变量转换为您自己的应用程序的AppDelegate类。这是一个例子:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];            
// Now you can access appDelegate.managedObjectContext;

注意:您需要#import "AppDelegate.h"在使用此代码的 .m 文件中。

于 2012-05-18T12:41:58.710 回答