Cocoa,使用集合运算符和多对多关系属性进行绑定
Posted
技术标签:
【中文标题】Cocoa,使用集合运算符和多对多关系属性进行绑定【英文标题】:Cocoa, binding using Collection Operators and To-Many relationship properties 【发布时间】:2012-02-29 14:54:36 【问题描述】:已经做了相当多的谷歌并在这里查看我相信以下无法完成。我对为什么它不能完成以及人们最好的解决方法很感兴趣,我在下面提供了我的。
我使用简单的部门 > 员工模型,既有名称属性,员工实体也有 timeWorked 属性。
问题
我想绑定一个表格,其中第一列显示部门名称,第二列显示部门。@sum.employees.timeWorked。尝试这样做会导致错误:
[<_NSFaultingMutableSet 0x1d5e50> addObserver:forKeyPath:options:context:] is not supported. Key path: timeWorked
Cannot remove an observer <NSTableBinder 0x1a9280> for the key path "employees.timeWorked" from <Depatement 0x1faf40> because it is not registered as an observer.
但是绑定到 department.employees.@count 确实有效(但我想要更多!)。
其他讨论
这里有另一个主题相同的问题:nstablecolumn-binding-using-collection-operators-like-sum
还有一个:cocoa-bindings-binding-to-the-many-end-of-a-to-many-relationship
我的解决方法
我对这个问题的解决方案是为执行求和的部门实体创建一个属性:
-(NSNumber *)departmentHours
return [self valueForKeyPath:@"employees.@sum.timeWorked"];
然后简单地绑定到它。
当我想要对数据进行某种排序/聚合时,添加这些属性只需要多一点代码,但我确实觉得能够绑定到会更优雅 部门。@sum.employees.timeWorked。
有什么想法吗??它不起作用的原因是什么?更好的解决方法?
大家干杯
【问题讨论】:
是否需要用上述方法创建属性或类别。 不必是属性并保存在持久存储中。你可以让它成为部门类的@property。但是,更改任何员工的工作时间不一定会导致重新计算部门工作时间。除非员工的 setTimeWorked 更改了 keyPathsForValuesAffectingDepartmentHours 中的 keyPath 【参考方案1】:你写的是绑定到department.@sum.employees.timeWorked
- 但是,我认为你应该绑定到department.employees.@sum.timeWorked
【讨论】:
以上是关于Cocoa,使用集合运算符和多对多关系属性进行绑定的主要内容,如果未能解决你的问题,请参考以下文章