将NSArrayController绑定到Core Data文档的托管对象上下文的新方法是什么?

时间:2015-01-28 03:37:37

标签: xcode core-data interface-builder cocoa-bindings

在Xcode开始添加Storyboard for OS X应用程序之前,您可以通过将Managed Object Context数组控制器与File's Owner绑定到Model Key Path,将数组控制器连接到文档的托管对象上下文managedObjectContext。有了故事板,就不再有File's Owner所以你从哪里获得上下文?

Apple的文档落后于这个领域,在Xcode中没有任何明显的地方可以绑定。显然,我可以回到非故事板路线并使用旧方法,但必须有一种新方法。

4 个答案:

答案 0 :(得分:10)

所以我得到了Apple的答案。这是基于文档的核心数据应用程序,代码全部在Swift中,但是在Objective-C中你的想法是相同的,你只需要翻译它。

他们给我的第一个答案是将数组控制器绑定到运行视图的视图控制器,模型关键路径为self.view.window.windowController.document.managedObjectContex。我展示的示例使用了这种方法并且根本没有任何错误消息,但它是一个带有一个阵列控制器的窗口控制器内的单个视图控制器。我的设置是一个窗口,指向一个场景中带有两个阵列控制器的视图的选项卡视图。每次打开或创建新文档时,我仍然会收到Cannot perform operation without a managed object context次。对我有用的第二个解决方案是仍然将数组控制器绑定到视图控制器,但模型关键路径为self.representedObject.managedObjectContext,然后添加到文档类的末尾{{1}功能:

makeWindowControllers()

这解决了我的问题。希望这里有足够的信息显示其他人谷歌这个问题。

答案 1 :(得分:8)

使用默认的Xcode生成项目并包含CoreData会将managedObjectContext成员放在AppDelegate上。您可以将以下代码添加到ViewController,然后使用managedObjectContext作为"模型密钥路径"绑定到ViewController的{​​{1}}。

NSArrayController

这只是创建一个重定向到您的实际MOC存储位置的成员。这很有用,因为NSArrayController绑定发生在lazy var managedObjectContext: NSManagedObjectContext = { return (NSApplication.sharedApplication().delegate as? AppDelegate)?.managedObjectContext }()! 之前,因此实例成员为什么不够。此外,如果要重构为单个viewDidLoad()类,则只需更改重定向到的位置即可。此外,您可以将其添加为类扩展,以使所有CoreDataManager能够访问您的MOC。

Objective-C版本根据要求:

ViewControllers

答案 2 :(得分:1)

如果应用程序委托拥有核心数据堆栈,则始终能够通过NSApplication与delegate.managedObjectContext的密钥路径绑定。否则你可以通过MOC传递给每个视图控制器,每个视图控制器上都有一个MOC属性,这是那些认为应用代表不应该用于拥有单个MOC的人的强烈偏好,并且能够为每个VC提供单独的MOC的进一步实用性。

我相信你也可以在IB的故事板中创建一个MOC实例。至少,它们也一直是笔尖的MOC对象。虽然我还没有充分利用它来了解它与程序化核心数据堆栈的关系。在VC层次结构或应用程序委托

中可以访问某个地方的MOC属性可能更好

答案 3 :(得分:1)

更新:

@theMikeSwan,好吧,它几乎适合我。这就是我所拥有的:

OSX EL Capitan GM Xcode 7GM和Xcode 7.1 beta

标准的Coredata /文件应用程序

用TabViewController替换了MainViewController,并为其添加了2个ViewControllers。

在代码中添加了将表示对象放在tabviewcontroller中的所有视图控制器中。

选项卡1是一个带有表的视图控制器,以及绑定到名为“个人档案”的实体的数组控制器,并且使用+/-等将该表视图绑定到该控制器

选项卡二是视图控制器带有表的视图,以及绑定到名为Commands的实体的数组控制器,并且tableview绑定到该控制器。

“个人档案”和“命令”实体之间存在一对多关系,其名称为< - >>命令。

两个标签都按预期工作,没有独立错误 - 这意味着我可以在第一个标签的表格中添加和删除个人资料 - >名称,我可以在表格中添加和删除命令 - >名称在第二个标签中。

接下来我想强制执行一对多关系 - 这意味着如果我在选项卡1的表中选择一个配置文件,然后切换到选项卡二,我想只看到与该表中所选配置文件相关的命令。这不起作用。在所有情况下都会显示所有输入的命令,我已经尝试了过滤谓词,获取谓词等,并且会有不同程度的灾难。

我已经尝试了所有我能想到的东西,以及许多我不想提及的黑客 -

此时我已将第二个arrayController添加到第二个选项卡视图并将其绑定到Profiles实体并使用self.representedObject.managedObjectContext等...我在第二个选项卡视图上添加了一个NSTextField并将其绑定到刚刚添加的profileArrayController - >选择 - >命名,看看控制器在想什么......

第二个标签中的个人资料 - >名称永远不会更改,无论我在第一个标签的表格中选择了什么,它始终显示相同的个人资料 - >名称。第二个选项卡中的表中列出的命令不受第一个表中任何选择的影响。

感觉"比如第二个选项卡上的MOC与第一个选项卡引用的MOC不同。但这只是一种感觉。我迷失了,关于如何在这样的多标签视图控制器设置上的标签之间建立一对多关系的任何建议?

感谢 弗兰克

编辑添加:

顺便说一下,我在其中一些选项卡上,比如命令选项卡,在同一选项卡上的一对多关系中配置的多个表正常工作 - 例如,我有一个同义词表,通过数组控制器绑定到同义词实体这是与命令实体的关系的许多方面。只要table / arraycontrollers在同一个选项卡上,它就可以正常工作,但是在单独的选项卡上,这并不是一种乐趣。