将NSArrayController绑定回ivar时出现问题

时间:2010-08-22 10:20:27

标签: cocoa core-data binding nsarraycontroller

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

问题在于:

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

以下是所有内容的连接方式:

  • 我有一个windowController,其中包含视图和arrayController的出口。

  • 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.

我在这里弄错了什么?请有人帮忙吗?

西蒙

2 个答案:

答案 0 :(得分:2)

有几件事。

首先,异常是正确的:无法设置任何NSValue对象的矩形值。他们是不变的。

听起来你正在尝试维护并行数组,矩形数组就是其中之一。不要那样做;绑定它上面的扼流圈,它也使AppleScript支持更加困难。

您需要做的是实现模型对象,并保留单个数组。无论你目前拥有什么阵列,包括矩形阵列,都应该成为模型对象的属性 - 每个阵列都有一个矩形,以及其他任何东西。

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

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

答案 1 :(得分:0)

我不完全确定我会按照你在那里做的,但你考虑过这种方法:

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

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

希望这不完全是重点。