Cocoa 故事板中的 CoreData ArrayControllers

Posted

技术标签:

【中文标题】Cocoa 故事板中的 CoreData ArrayControllers【英文标题】:CoreData ArrayControllers in Cocoa Storyboards 【发布时间】:2015-06-01 10:20:06 【问题描述】:

我正在开发 ios 应用程序的 Mac OS 端口,但在基于 Storyboard 的 Cocoa 应用程序中使用 NSArrayControllers 时确实遇到了 NSManagedObjectContexts 的问题。

这是一个后续问题: Storyboard with TabViewController in OS X Application - Core Data Array Controllers in each scene?

我确实有一些 ViewController,就像 TabBarController 中一样,显示相同的 CoreData 实体。它们通过 NSArrayControllers 加载,与 InterfaceBuilder 连接。

根据我现有的知识,在屏幕上获取数据是没有问题的。即使编辑和保存到 CoreData 也可以。 但我意识到,每个 Storyboard 场景都有自己的 NSArrayControllers 实例和每个自己的 NSManagedObjectContext。 在一个屏幕上更改和保存数据时,它不会在其他屏幕上更新,这些屏幕都通过 IB 绑定进行绑定,并且在所有其他情况下都有效。它们只是显示数据,它们最初已加载并且不会自动更新。

我认为问题在于,从 contextA 更改的数据没有合并(或同步)到其他屏幕的其他上下文。

最好的方法是什么?我应该为此使用 NSManagedObjectContextDidSaveNotification 吗?

这意味着,我将不得不编写大量代码,以手动开始将更改从一个上下文合并到所有其他 NSManagedContexts。对我来说真的很难闻。我认为一定有一个更简单的方法,我不知道也无法找到。

如果您确实对我有提示,请让我朝着正确的方向前进。 已经谢谢你了。

【问题讨论】:

使用一个 MOC。将每个阵列控制器绑定到那个 MOC。如果都是主线程 GUI 的东西,你不应该有很多。 感谢您的评论。事实上,我以为我做到了,将所有 ArrayControllers 绑定到 AppDelegate.moc,但是在调试控制器时,我发现它们都有不同的 MOC 实例?! 问题解决了,我在 Cocoa 绑定中犯了一个拇指错误:我只是将情节提要中的一个对象拖到每个场景并将其设置为 AppDelegate。我刚刚用这个实例化了几个 AppDelegates,非常糟糕的主意!我纠正了这个问题,通过我的 ViewControllers 上的属性引用 AppDelegate,现在它可以正常工作了。 IB 只是有它的小优势,人们必须完全了解正在发生的事情。谢谢你的评论,它让我思考,我的问题在哪里! 对于其他用户来说,通过链接到遇到类似问题的其他人来回答您自己的问题是值得的。应用委托对象引发了各种悲痛,而且难以调试。自从故事板被引入 OSX 以来,我发现这个问题越来越多。 【参考方案1】:

问题解决了,我在 Cocoa 绑定中犯了一个拇指错误:我只是将情节提要中的一个对象拖到每个场景并将其设置为 AppDelegate。我刚刚用这个实例化了几个 AppDelegates,非常糟糕的主意!我纠正了这个问题,通过我的 ViewControllers 上的属性引用 AppDelegate,现在它可以正常工作了。 IB 只是有一点点优势,人们必须完全了解正在发生的事情。

【讨论】:

以上是关于Cocoa 故事板中的 CoreData ArrayControllers的主要内容,如果未能解决你的问题,请参考以下文章

故事板中的 UITableView

故事板中的当前选项卡

为啥故事板中的按钮不在 ios8 中的适当位置?

故事板中的 UIViewController 容器

使用故事板中的自动布局使 UIButtons 居中

故事板中 tableviewController 中的原型 tableview 单元格