我正在使用CoreData,并在NSManagedObjectContext
文件中设置了AppDelegate
。
我需要在一个ViewController中获取该managedObjectContext,它在naviagation树中有很多级别。显然,我不想将它传递给所有init方法。
我已经尝试了[[[UIApplication sharedApplication] delegate] managedObjectContext];
但是我收到了这个错误“没有已知的选择器实例方法'managedObjectContext'”
有人可以指导我如何从AppDelegate
到ViewContoller
获取managedObjectContext吗?
答案 0 :(得分:13)
首先,您需要在AppDelegate.h
中创建一个属性,如下所示:
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext; // or strong if you ARC instead of retain
使用readonly
阻止您在外部修改上下文。
在AppDelegate.m
合成它,如:
@synthesize managedObjectContext;
始终在AppDelegate.m
内覆盖像
- (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撰写的passing-around-a-nsmanagedobjectcontext-on-the-iphone。
希望它有所帮助。
答案 1 :(得分:2)
您需要将全局sharedApplication变量强制转换为您自己的应用程序的AppDelegate
类。这是一个例子:
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
// Now you can access appDelegate.managedObjectContext;
注意:您需要在使用此代码的.m文件中#import "AppDelegate.h"
。