NSPredicateEditor, игнорировать строки без условий поиска?

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

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

dataName CONTAINS[cd] ""

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

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

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


person Mark Boszko    schedule 13.01.2010    source источник


Ответы (2)


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

person Brian Webster    schedule 13.01.2010

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

person Ashley Clark    schedule 15.01.2010