NSPredicateEditor, игнорировать строки без поисковых терминов? - PullRequest
1 голос
/ 13 января 2010

Сразу скажу, что я неопытный программист Какао, и я прошу прощения, если на мой вопрос каким-то образом дан ответ в документации, и я просто пропустил его, или было что-то, чего я не понимаю в том, как работает NSPredicateEditor. Тем не менее, я пытался искать в документах и ​​гуглил, чтобы получить небольшой эффект. Таким образом, я задаю вам вопрос.

Я пытаюсь отфильтровать табличное представление на основе базовых данных с помощью NSPredicateEditor. Фильтрация работает нормально, с точки зрения фильтрации строк на основе различных критериев, путем создания NSCompoundPredicate. Однако, когда строка в редакторе предикатов не имеет текста в своем поле поиска, возвращаемый NSPredicate представляет собой что-то вроде

dataName CONTAINS[cd] ""

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

Тогда мой вопрос: какое самое простое / лучшее решение игнорировать эти части предиката? Моя первоначальная идея заключалась в том, чтобы разбирать значение NSPredicateEditor строка за строкой с (NSPredicate *)predicateForRow:(NSInteger)row и самостоятельно перестраивать предикат, игнорируя строки, которые пытаются соответствовать "", но это кажется излишне громоздким. Разобрав окончательный NSCompoundPredicate с - (NSArray *)subpredicates и отредактировав его таким образом, также, возможно, я ошибаюсь. Есть ли более элегантный способ сделать это?

* Для ясности, я имею в виду редактирование копии предиката, которую я затем передаю контроллеру для представления таблицы, а не редактирование исходного предиката, который в данный момент хранится в NSPredicateEditor.

Ответы [ 2 ]

1 голос
/ 13 января 2010

Похоже, что вы должны иметь возможность создавать подкласс NSPredicateEditor и переопределять predicateForRow: (объявлено в суперклассе NSPredicateEditor, NSRuleEditor) и выполнять там замену. По сути, вы просто вызвали бы реализацию super, затем исследовали предикат и возвращали вновь созданный, если это необходимо.

0 голосов
/ 16 января 2010

Брайан, я думаю, имеет правильную идею, но NSPredicateEditor в Snow Leopard не вызывает -predicateForRow: для генерации своих предикатов. Вам нужно переопределить метод -predicate более высокого уровня, но все еще довольно просто проверить структуру предиката и исключить любые сравнения с nil или пустой строкой constantValue.

...