我知道如何解决问题,但令我困扰的是我不明白为什么这不起作用。我有一个使用 Core Data 的 UIViewController 子类,所以它需要 NSManagedObjectContext。该控制器是从一个 nib 文件中加载的,该文件位于标签控制器内的导航控制器下。
我尝试在 initWithCoder 和 viewDidLoad 中执行此操作,但由于某种原因它不起作用:
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
self.managedObjectContext = [[appDelegate managedObjectContext] retain];
出于某种原因,managedObjectContext 返回 nil,当我稍后尝试创建托管对象时我得到了这个:
*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“+entityForName:无法在此模型中找到名为“LogRecord”的实体。
当您的上下文为零或模型无法加载(或确实缺少实体)时,您会得到什么。
如果我在 saveLogEntry 方法(创建托管对象并保存上下文)的顶部执行完全相同的操作,那么它就可以正常工作。
如果我按照食谱示例应用程序所做的那样做:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
loggingViewController.managedObjectContext = self.managedObjectContext;
// Standard stuff
[window addSubview:tabBarController.view];
[window makeKeyAndVisible];
}
(loggingViewController 是应用程序委托中的 IBOutlet)。
有谁知道这里具体可能发生什么?如果“过早”完成,它似乎会失败,但尤其是对于 viewDidLoad 我希望它能够工作,因为我认为在调用 addSubview 之后会发生这种情况。