setFilterPredicate на NSArrayController не работает, если он находится в «Автоматическом изменении содержимого» - PullRequest
4 голосов
/ 01 декабря 2011

У меня есть классическое приложение CoreData, отображающее его данные в NSTableView с привязкой (все сделано с помощью XCode 4.2).

Работает нормально, пока вчера не решу проверить в Инспекторе атрибутов «Авто перегруппировать содержимое»для ArrayController.Теперь, когда я пытаюсь установить для него предикат фильтра, я получаю:

[<_NSFaultingMutableSet 0x102b65950> addObserver:forKeyPath:options:context:] is not supported. Key path: name

Имейте в виду, что без этой опции он работает отлично: предикат хорош, и контроллер правильно фильтрует управляемый контент,и табличное представление отображает только сущность, которая соответствует предикату.

Конечно, я мог бы просто деактивировать это «автоматическое изменение содержимого», но это полезно для поддержания порядка сортировки в случае измененияюридические лица.Если я отредактирую одну сущность, «дата изменена» изменится, и, поскольку мой порядок сортировки в эту дату, я хочу, чтобы TableView автоматически переупорядочил свою строку.И это происходит с этой опцией, но, увы, с добавленной ошибкой «addObserver не поддерживается».

_NSFaultingMutableSet происходит от отношения ко-многим в соответствующей сущности, отсюда и «Set».Может быть, «Автоматическая перегруппировка контента» не совместима с «setFilterPredicate» с отношением «ко-многим»?

У кого-нибудь возникла подобная проблема?Внутренняя ошибка NSArrayController?

Примечание : предикаты, вызывающие проблему, имеют вид

name CONTAINS[cd] %@ OR ANY aliases.name CONTAINS[cd] %@

или

ANY tags.name CONTAINS[cd] %@ OR ANY tags.aliases.name CONTAINS[cd] %@

это кажетсячто «ЛЮБОЙ» вызывает конфликт ...

1 Ответ

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

Нашел решение, с приведенным выше комментарием к SUBQUERY.

Оставьте опцию «автоматически переупорядочивать содержимое», но измените предикат на:

name CONTAINS[cd] %@ OR SUBQUERY(aliases, $anAlias, $anAlias.name CONTAINS[cd] %@).@count != 0

и

SUBQUERY(tags, $aTag, $aTag.name CONTAINS[cd] %@).@count !=0 OR SUBQUERY(tags, $aTag, $aTag.aliases.name CONTAINS[cd] %@).@count !=0

Соответственно.

Возможно, предикат был неверен, я просто не сталкивался с другими проблемами раньше.

...