Использование предикатов в контроллере массива для фильтрации связанных объектов
У меня есть приложение, использующее Core Data и привязки. Я хочу иметь NSSearchField, который может искать через NSArrayController, связанный с NSTableView. Контроллер массива содержит объекты Core Data, которые имеют поле "name". Я настроил NSSearchField следующим образом:
Bind To: the array controller
Controller Key: filterPredicate
Predicate Format: name contains[c] $value
Это работает. Я хочу расширить его, чтобы он мог искать в полях объектов, связанных с таковыми в контроллере массива. Каждый объект в контроллере массива имеет отношение "ко-многим" к другому типу объекта с именем "tag", который имеет поле с именем "name". Я попробовал следующее:
Bind To: the array controller
Controller Key: filterPredicate
Model Key Path: tags
Predicate Format: name contains[c] $value
Это, однако, не работает. Ничего не происходит в NSTableView, когда текст вводится в NSSearchField. Что с этим не так?
1 ответ
Привязка к tags
поскольку путь ключа модели пытается связать предикат поля поиска с путем ключа arrayController.filterPredicate.tags. Поскольку свойство filterPredicate контроллера массива не имеет свойства тегов, вы, вероятно, получаете исключения "ключ не найден", которые регистрируются в автоматическом режиме. Вместо этого, напоминая, что filterPredicate NSArrayController применяется к членам массива, вы хотите, чтобы привязка была настроена примерно так:
Bind To: <array controller>
Controller Key: filterPredicate
Predicate Format: ANY self.tags contains[c] $value
self.tags
может быть написано как просто tags
, но я думаю, это проясняет, что теги - это свойство объекта, к которому применяется предикат.