使用Employees-Departments示例,我想要做的是将一列绑定(bind)到“Departments.arrangedObjects.employees。@ sum.hoursWorked”,如下所示:
实体员工
实体部门
我想要一个表,其中将显示有关部门的一些摘要信息。
我将第一列绑定(bind)到“部门”数组 Controller “arrangedObjects.name”。
我可以通过绑定(bind)到“arrangedObjects.employees。@ count”来显示一列部门的雇员数
但是,我无法像通过绑定(bind)到“arrangedObjects.employees。@ sum.hoursWorked”那样获得员工的总工作时间
我遇到的错误是“不支持[[__NSFaultingMutableSet 0x1acea0> addObserver:forKeyPath:options:context:]。关键路径:@ sum.hoursWorked”
我相信这是因为不可能绑定(bind)到一对多关系的许多方面。如果可以,我该怎么做?
为了获得额外的荣誉,假设每个员工还具有另一个属性“种族”,我还希望摘要表显示每个部门中唯一种族的数量。
提前致谢。
最佳答案
我遇到了与您相同的错误。看来,您可以通过执行以下操作来获得一组雇员并对其执行一些集合操作:
部门*部门=;
NSSet *员工=部门员工;
NSNumber * sumOfHoursWorked = [员工valueForKeyPath:@“@ sum.hoursWorked”];
绑定(bind)时有所不同。绑定(bind)要求观察密钥路径,而不是对其进行一次评估。鉴于此,sorta很有意义,为什么您不能绑定(bind)到这些关键路径。金田索塔
现在。对于解决方案,在这种情况下,我通常要做的是编写一个小的NSValueTransformer子类来执行我需要的操作,然后将其插入IB。这样,我编写了十行代码,但是由于缺少简单的汇总,最终没有完成整个NSTableView数据源代码。在这种情况下,您可以执行以下操作:
// Declaration
@interface MySumOfHoursWorkedTransformer : NSValueTransformer
@end
@interface MyNumberOfRacesTransformer : NSValueTransformer
@end
// Implementation
@implementation MySumOfHoursWorkedTransformer
+ (Class)transformedValueClass { return [NSNumber class]; } // class of the "output" objects, as returned by transformedValue:
+ (BOOL)allowsReverseTransformation { return NO; } // flag indicating whether transformation is read-only or not
- (id)transformedValue:(id)value // by default returns value
{
NSNumber* retVal = nil;
if ([value isMemberOfClass: [Department class]])
{
double hoursWorked = 0.0;
for (Employee* employee in [value valueForKey: @"employees"])
{
NSNumber* hoursWorkedNumber = employee.hoursWorked;
hoursWorked += hoursWorkedNumber ? [hoursWorkedNumber doubleValue] : 0.0;
}
retVal = [NSNumber numberWithDouble: hoursWorked];
}
return retVal;
}
@end
@implementation MyNumberOfRacesTransformer
+ (Class)transformedValueClass { return [NSNumber class]; } // class of the "output" objects, as returned by transformedValue:
+ (BOOL)allowsReverseTransformation { return NO; } // flag indicating whether transformation is read-only or not
- (id)transformedValue:(id)value // by default returns value
{
NSNumber* retVal = nil;
if ([value isMemberOfClass: [Department class]])
{
NSMutableSet* raceSet = [NSMutableSet set];
for (Employee* employee in [value valueForKey: @"employees"])
{
id raceVal = employee.race;
if (raceVal)
[raceSet addObject: raceVal];
}
retVal = [NSNumber numberWithUnsignedInteger: raceSet.count];
}
return retVal;
}
@end
然后,只需将这些TableColumns绑定(bind)到ArrayController.arrangedObjects并插入适当的值转换器子类。现在,您将无法编辑这些值,但是无论如何编辑汇总值意味着什么?
希望能有所帮助。我已经大量使用了这种方法,并且肯定会放弃绑定(bind)。
关于core-data - cocoa 绑定(bind):绑定(bind)到一对多关系的“many”末端,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3826009/