0

我对自定义视图的绑定属性有疑问。该属性绑定到核心数据实体的 NSArrayController。

这是问题所在:

在我看来,我画了几个矩形。这些矩形的位置保存在核心数据中的实体中(作为 NSValue 包装的 NSRects)。矩形是可拖动的,当我拖动一个矩形时,我希望实体更新到新位置。但我不知道如何将 arrayController 绑定回视图。

以下是一切的连接方式:

  • 我有一个带有视图和arrayController 插座的windowController。

  • arrayController 绑定到 windowController 的 managedObjectContext ,因此绑定到我的核心数据模型。(该绑定和与实体的绑定是在 Interface Builder 中建立的)

  • 视图通过 ivar“rectangleValuesArray”绑定到 arrayController

最后一个绑定是在 windowController 中建立的,使用:

[connectionsView bind:@"rectangleValuesArray"
             toObject:elementsArrayController
          withKeyPath:@"arrangedObjects.rectangleValue"
              options:nil];

到目前为止有效。

现在我尝试在另一个方向建立绑定:

[elementsArrayController bind:@"arrangedObjects.rectangleValue"
                     toObject:connectionsView
                  withKeyPath:@"rectangleValuesArray"
                      options:nil];

现在,当我更改 ivar 时,应该更新实体(对吗?)。但这不起作用 - 我从控制台得到:

Cocoa Bindings: Error setting value for bound property arrangedObjects.rectangleValue of object <NSArrayController: 0x200027100>[entity: Element, number of selected objects: 1]: [<NSArrayController 0x200027100> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key arrangedObjects.rectangleValue.

我在这里做错了什么?请问,有人帮忙吗?

西蒙

4

2 回答 2

2

有几件事。

首先,例外是​​正确的:不可能设置任何 NSValue 对象的矩形值。它们是不可变的。

听起来您正在尝试维护平行数组,矩形数组就是其中之一。不要那样做;Bindings 阻塞了它,它也使得 AppleScript 支持变得更加困难。

您需要做的是实现模型对象,并保留一个数组。您当前拥有的任何数组,包括矩形之一,都应该成为模型对象的属性——每个都有一个矩形,以及其他任何东西。

另一件事是您没有将控制器绑定到视图;您将视图绑定到控制器。已经这样做了,你就完成了。

如果可能,您也可以考虑在 IB 中而不是在代码中进行设置。不要抗拒使用 IB;这是你的朋友。

于 2010-08-22T11:15:49.273 回答
0

不完全确定我是否遵循您在那里所做的事情,但您是否考虑过这种方法:

  • 为您的阵列控制器提供一个 ivar 视图IBOutlet NSArrayController* myArrayController(可能已经有类似的东西,我想),并在 IB 中设置该连接
  • 省略窗口控制器中的两个手动绑定调用

现在,为了从视图中修改数组控制器的内容,您可以调用[myArrayController mutableArrayValueForKeyPath:@"arrangedObjects.rectangleValue"],它应该为您提供该密钥路径的代理,您可以使用 KVO 更新随意修改该密钥路径。

希望这不是完全无关紧要的。

于 2010-08-22T11:14:34.357 回答