Как NSArrayController может сортировать по отношению ко многим? - PullRequest
0 голосов
/ 01 декабря 2011

Используя CoreData, у меня есть сущность «Закладка», которая имеет отношение ко многим, называемое «теги», с другой сущностью «Тег», и некоторые атрибуты связи (строка, дата, ...).

В NSTableView мы отображаем сущность Bookmarks через Binding:

  • NSArrayController привязан к Owner.managedObjectContext файла (стандартный шаблон CoreData XCode, managedObjectContext находится в AppDelegate)
  • Столбцы в TableView привязаны к их соответствующему атрибуту.В частности, столбец Tag связан с этим arrayController.arrangedObjects.tags с подклассом NSValueTransformer, так что мы можем показать в виде NSString сводку отношения ко многим.

Это работает.Теперь, когда я нажимаю на заголовок столбца, представление всей таблицы сортируется правильно, за исключением столбца 'tag', где я получаю это:

-[_NSFaultingMutableSet compare:]: unrecognized selector sent to instance

Наверняка "Set" из этого отношения ко-многим неответить на селектор «сравнить:».

Вопрос : Как я могу сделать эту работу?Как я могу отсортировать по отношению ко многим?

Доступно ли что-то вроде ValueTransformer?Если бы я мог предоставить собственный класс, который будет выполнять сравнение: чтобы ArrayController знал ...

1 Ответ

0 голосов
/ 02 декабря 2011

Один из возможных способов взлома: поскольку _NSFaultingMutableSet - это NSSet, мы можем добавить селектор «Сравнить:» через категорию.

@interface NSSet (someAdditions)
   - (NSComparisonResult)compare:(NSSet *)anotherSet;
@end

@implementation NSSet (someAdditions)
   - (NSComparisonResult)compare:(NSSet *)aSet {
      ...  
   }
@end

Теперь мы можем реализовать этот селектор сравнения: как мы хотим, например, сравниваяколичество каждого набора или их представление NSString в некотором роде.

Это работает в моем приложении.Я снова включил «Создает дескриптор сортировки» в привязке NSTableColumn и теперь могу щелкнуть заголовок моего tableView для сортировки.

Это хак, потому что это влияет на все NSSet ... Но, по крайней мере, яВозьми мой крюк.

Что ты думаешь?

...