【发布时间】:2012-08-20 21:36:55
【问题描述】:
如果您对我的故事不感兴趣,请立即跳到底部的两个编号问题。
在this Question 中,讨论了是否将CoreData 处理与AppDelegate 分开。我决定尝试关注点分离的方式。
由于 Apple 没有为 AppKit 应用程序提供关于该主题的文档,我的问题是:
- 是否有说明如何将 CoreData 堆栈与 AppDelegate 分离的文档、资源甚至示例项目?
我现在的状态是这样的:
我有一个AppDelegate 和一个DataController,它是NSTreeController 的子类。 DataController 控制 NSOutlineView,它显示了我的 CoreData 模型的对象(组和叶子)。
我从 Xcode 的 CoreData(不是基于文档的)模板开始。
- 我将所有与 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 中添加和删除对象,撤消和重做也可以。但是,文件保存菜单项是灰色的,当我点击 cmd+s 时,我从操作系统中得到了 bing。 (当我在 AppDelegate 中有 CoreData 堆栈时,这曾经“神奇地”工作。)
当我退出应用程序时,OutlineView 中的对象通过applicationShouldTerminate 调用写入persistentStore(我看到了xml)。但是,当我重新启动应用程序时,对象并没有恢复到OutlineView。 (当我在 AppDelegate 中拥有 CoreData 堆栈时,这曾经“神奇地”工作。)
- 隐藏在
CoreData模板中的什么神奇的胶水代码使 cmd+s 工作并启用文件 - 保存菜单项? - 什么隐藏代码在应用程序启动时将我的
mangedObjectContext的内容恢复到我的OutlineView。
【问题讨论】:
-
我只为 iOS 做过这个,所以它不是你想要的,但我使用的实现是基于 nachbaur.com/blog/smarter-core-data
-
您需要在响应者链中具有文件保存操作,因此您可以将控制器添加到响应者链或考虑在应用程序委托中实现它 - 默认情况下在响应者链中。
-
@Monolo 感谢您提及
responder chain!我将(使用右键单击)First Responders saveAction 连接到 Save... 菜单项。由于我已经将AppDelegate的saveAction 转发到DataController,因此启用了菜单项并且 cmd+s 也可以使用。
标签: macos cocoa core-data separation-of-concerns appdelegate