使用Employees-Departments示例,我想要做的是将一列绑定(bind)到“Departments.arrangedObjects.employees。@ sum.hoursWorked”,如下所示:

实体员工

  • 属性:“firstName”,“lastName”,“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/

    10-11 22:02
    查看更多