objective-c - 核心数据 : Strange bindings error on re-opening a document. 有帮助吗?

标签 objective-c cocoa macos core-data

我一直在构建一个核心数据应用程序来管理一些数据,但我被一个错误所困扰,该错误表明我的对象不符合 KVO。但是,我还没有修改 NSManagedObject 的默认 KVO 合规性,现在我很困惑。

该错误影响的应用程序区域是创建一些类别并组织一些将存在于这些类别中的项目。项目可以存在于多个类别中,并且项目和类别查看顺序可以由用户设置。简单的东西。

为了更好地可视化这一点,我设置的核心数据模型的关键部分如下所示。我稍微简化了实体的命名和属性:

Category <--------->> CategoryItem <<---------> Item
--------              ------------              --------
name                  viewPosition              name
viewPosition                                    description

该模型连接到界面构建器中的两个 ArrayController,一个用于类别,一个用于类别项。 Categoryitems 内容集通过 Selection.categoryItems 绑定(bind)设置到类别数组 Controller 。这些数组 Controller 提供两个 TableView 。类别项表的内容通过arrangedObjects.item.name绑定(bind)到CategoryItem A.C Controller 。

这一切都很完美,我可以按照自己的意愿拖放和排序项目和类别。

除了一个奇怪的案例。

每当我创建仅包含一项的类别,然后保存时,如果我随后重新打开文档,则会出现以下错误:

无法删除观察者 <NSTableBinder 0x1627f670>对于 <NSManagedObject 0x16273380> 中的关键路径“item.name” ,很可能是因为键“item”的值已更改,而没有发送适当的 KVO 通知。检查 NSManagedObject 类的 KVO 合规性。

此后,界面似乎崩溃了,应用程序变得无法使用。我在网上搜索过,我所能发现的就是这表明 KVC 不合规。但我在这里使用标准的、几乎没有修改的 Apple 类。

当我仅绑定(bind)到 CategoryItem 的 viewPosition 时,不会引发该错误。即通过arrangedObjects.viewPosition而不是arrangedObjects.item.name。就好像在表最初观察到的点处,categoryitem 和 item 之间的关系尚未准备好(并且仅当有一个项目时)。

还有人遇到过这种情况吗?有人能想到一个可能的解决方法吗?

最佳答案

结果证明这是一个错误。这是报告,其中包含原因和解决方法。

NSArrayController“自动重新排列内容”引发 NSManagedObjects 的 KVO 异常

摘要: 当在管理核心数据实体的数据的 NSArrayController 上选中“自动重新排列内容”时,会引发异常“无法删除键路径“x”的观察者”。

根据我的调查,似乎在 NSArrayController 上检查“自动重新排列内容”时,并未完全实现 KVO 合规性。在大多数情况下,它工作得很好,但我发现有一个特定的情况破坏了这种合规性。

这很难说清楚,但当尝试访问由 NSArrayController 管理的实体的关系(即,arrangedObjects.person.name)并检查自动重新排列内容时,似乎会发生这种情况。除此之外,它似乎只在重新打开文档之后并且当该 Controller 正在管理一组恰好一个项目时发生......

如果您查看示例项目并按照以下步骤操作,可能会更容易...

重现步骤: 1)打开附件中的项目 2)打开MyDocument.xib 3)检查“事件人员”NSArrayController 是否选中“自动重新排列内容” 4) 构建并运行 5) 单击左栏下方的加号添加一项事件 6) 单击右侧栏下方的加号,添加一名事件人员(不多也不少) 7) 保存文档 8)重新打开文档

预期结果: 文档重新打开,用户可以通过响应式界面随意添加和删除事件和人员。

实际结果: 一旦右侧列尝试显示只有一个事件人员的事件的事件人员,UI 就会出现不可预测的行为。使应用程序无法使用。

注释: 我创建了一个测试项目来定位这个错误,代码和模型应该非常不言自明,但如有任何问题请随时与我联系。

可以通过取消选中“自动重新排列内容”并手动调用 NSArrayController 上的rangeObjects 来解决此问题。

关于objective-c - 核心数据 : Strange bindings error on re-opening a document. 有帮助吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1028700/

相关文章:

objective-c - UIButton 上的淡入淡出动画

macos - 如何检测连接到 mac os x 的每个存储 USB 设备?

objective-c - 选择第一行时,数据未加载到详细 View Controller

objective-c - 在 Objective-C 中定义私有(private)变量的最佳方式

objective-c - AUSampler 出厂预设 MacError -1073748960

swift - [NSView重新加载数据] : unrecognized selector sent to instance

c++ - 如何在 OSX Mavericks 中为 Xcode 5.0.2 安装命令行工具?

xcode - OS X Storyboard 在 applicationDidFinishLaunching 之前调用 viewDidLoad

ios - 如果我的应用程序要长期使用,我应该将我的 ObjC 应用程序转换为 Swift 吗?

objective-c - 查看 interpretKeyEvents : but pass unwanted ones up the responder chain?