gpt4 book ai didi

ios - 设置 ViewController 的 managedObjectContext

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:50:51 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com