如果您对我的故事不感兴趣,请立即跳到底部的两个编号问题。
在这个问题中,讨论了是否将 CoreData 处理与 AppDelegate 分开。我决定尝试关注点分离的方式。
由于 Apple 没有为 AppKit 应用程序提供有关该主题的文档,我的问题是:
- 是否有任何文档、资源甚至示例项目显示如何将 CoreData 堆栈与 AppDelegate 分离?
我现在的状态是这样的:
我有一个AppDelegate
和一个DataController
,它是一个子类NSTreeController
。DataController
控件 aNSOutlineView
显示我的CoreData
模型的对象(组和叶子)。
我CoreData
从 Xcode 的(不是基于文档的)模板开始。
- 我将所有与 CoreData-Stack 相关的方法
AppDelegate
从DataController
. - 我做了
DataController
一个单身人士。 AppDelegate
我将真正的相关方法转发给了DataController
这样的:
在 AppController.m 中
- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window{
return [[[DataController sharedController] managedObjectContext] undoManager];
}
- (IBAction)saveAction:(id)sender{
[[DataController sharedController] saveAction:sender];
}
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender{
return [[DataController sharedController] applicationShouldTerminate:sender];
}
- 所有那些被调用的方法当然都是在 DataController.m 中实现的
现在我可以在NSOutlineView
、undo 和 redo 中添加和删除对象了。但是,文件保存菜单项是灰色的,当我点击 cmd+s 时,我从操作系统中得到了 bing。(当我在 AppDelegate 中拥有 CoreData 堆栈时,这曾经“神奇地”工作。)
当我退出应用程序时,我的对象通过调用OutlineView
写入persistentStore
(我看到了 xml) 。applicationShouldTerminate
但是,当我重新启动应用程序时,对象不会恢复到OutlineView
. (当我在 AppDelegate 中拥有 CoreData 堆栈时,这曾经“神奇地”工作。)
- 隐藏在
CoreData
模板中的魔术胶水代码使 cmd+s 工作并启用文件 - 保存菜单项? - 什么隐藏的代码在应用程序启动时将我的内容恢复
mangedObjectContext
到我的。OutlineView