2010-09-29 2 views
3

Использование примера Employees-Departments, которое я хочу сделать, - это привязать столбец к «Departments.arrangedObjects.employees. @ Sum.hoursWorked», как указано ниже :Связывание какао: привязка к «многим» отношениям ко многим.

Entity Сотрудник

  • атрибуты: "Имя", "Фамилия", "hoursWorked"
  • отношения: "отделы"

Entity Департамент

  • атрибуты: "Имя"
  • отношения: "сотрудники"

Я хочу таблицу, которая будет отображать некоторые сводные данные об отделах.

Я привязываю первый столбец к контроллеру массива «Департаменты», «builtObjects.name». У меня может быть столбец, показывающий количество сотрудников в отделе, привязав к «assemblyObjects.employees. @ Count»

Тем не менее, я не могу получить сумму часов, занятых сотрудниками, поскольку я полагаю, "arrangedObjects.employees @ sum.hoursWorked"

Я получаю ошибку вдоль линий "[< _NSFaultingMutableSet 0x1acea0> addObserver: forKeyPath: варианты: контекст:]. не поддерживается Key пути: @ sum.hoursWorked"

Я считаю, что это связано с тем, что невозможно связать со многими терминами «многие ко многим». Если да, то как я могу делать то, что хочу?

Для дополнительного кредита, скажем, у каждого сотрудника также есть другой атрибут «расы», мне также хотелось бы, чтобы в моей таблице резюме показывалось количество уникальных рас в каждом отделе.

Заранее благодарен.

ответ

1

Я столкнулся с теми же ошибками, что и вы. Кажется, что, хотя вы можете получить набор сотрудников и выполнить на нем некоторый набор совокупных операций, выполнив что-то вроде:

Отдел * dept =; NSSet * employees = dept.employees; NSNumber * sumOfHoursWorked = [employee valueForKeyPath: @ "@ sum.hoursWorked"];

Есть разница, когда вы связываете. Привязки просят наблюдать ключевой путь, а не оценить это один раз. Учитывая, что это похоже, sorta имеет смысл, почему вы не можете привязываться к этим ключевым путям. Вроде. Сорта.

Теперь. Что касается решения, то, что я обычно делаю в таких случаях, это написать крошечный небольшой подкласс 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 к ArrayController.организовал объекты и подключил соответствующий подкласс трансформатора значений. Теперь вы не сможете редактировать эти значения, но что бы это значило, чтобы изменить совокупное значение?

Надеюсь, что помогает. Я использовал этот подход в связке, и он уверен, что откажется от привязок.

+0

cool sh * t. Я попробовал подкласс ValueTransformer, но никогда не мог привязываться к нему. Он установлен в методе + инициализации NSDocument или ... –

Смежные вопросы