我遇到自定义视图的绑定属性问题。该属性绑定到核心数据实体的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.
我在这里弄错了什么?请有人帮忙吗?
西蒙
答案 0 :(得分:2)
有几件事。
首先,异常是正确的:无法设置任何NSValue对象的矩形值。他们是不变的。
听起来你正在尝试维护并行数组,矩形数组就是其中之一。不要那样做;绑定它上面的扼流圈,它也使AppleScript支持更加困难。
您需要做的是实现模型对象,并保留单个数组。无论你目前拥有什么阵列,包括矩形阵列,都应该成为模型对象的属性 - 每个阵列都有一个矩形,以及其他任何东西。
另一件事是你没有将控制器绑定到视图;将视图绑定到控制器。已经完成了,你已经完成了。
如果可能,您也可以考虑在IB中而不是在代码中设置它。不要抗拒使用IB;这是你的朋友。
答案 1 :(得分:0)
我不完全确定我会按照你在那里做的,但你考虑过这种方法:
IBOutlet NSArrayController* myArrayController
ivar(可能已经有类似的东西,我想),并在IB中设置该连接现在,为了从视图中修改数组控制器的内容,您需要调用[myArrayController mutableArrayValueForKeyPath:@"arrangedObjects.rectangleValue"]
,其中应该为您提供该密钥路径的代理,您可以修改该路径随意进行KVO更新。
希望这不完全是重点。