我正在使用 CoreData 并在 AppDelegate
文件中设置了 NSManagedObjectContext
。
我需要在 ViewController 中获取 managedObjectContext,它位于导航树的许多层级深处。显然,我不想将它传递给所有 init 方法。
我已经尝试过 [[[UIApplication sharedApplication] delegate] managedObjectContext];
但我收到此错误“选择器‘managedObjectContext’没有已知的实例方法”
有人可以指导我如何将 managedObjectContext 从 AppDelegate
获取到此 ViewContoller
吗?
最佳答案
首先,您需要在 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
header (#import "AppDelegate.h"
)之前,您可以:
AppDelegate* appDelegate = [AppDelegate sharedAppDelegate];
NSManagedObjectContext* context = appDelegate.managedObjectContext;
注意事项
使用这种方法会使您的应用程序变得僵化。为了克服这个问题,我建议你阅读 passing-around-a-nsmanagedobjectcontext-on-the-iphone作者:马库斯·扎拉。
希望对您有所帮助。
关于ios - 设置 ViewController 的 managedObjectContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10652615/