Редактирование NSPredicate с использованием NSPredicateEditor

Я могу легко создать NSPredicate, используя NSPredicateEditor (подкласс NSRuleEditor). Что я хотел бы знать, это:

Как я могу взять существующий NSPredicate (созданный редактором) и загрузить его в редактор, чтобы я мог его изменить?

РЕДАКТИРОВАТЬ: Я попытался @ предложение Джону использовать setObjectValue:, но это не совсем сработало. Позвольте мне объяснить мои настройки немного больше:

У меня есть приложение Какао на основе документа, и в окне документа есть только NSPredicateEditor. в dataOfType:error: Метод у меня есть:

NSPredicate * pred = [predicateEditor objectValue];
NSData * predicateData = [NSKeyedArchiver archivedDataWithRootObject:pred];
return predicateData;

в readFromData:ofType:error: Метод у меня есть:

NSPredicate * pred = [NSKeyedUnarchiver unarchiveObjectWithData:data];
[predicateEditor setObjectValue:pred];
return (pred != nil);

Я убедился, что предикат правильно архивируется и не архивируется, но после открытия сохраненного предиката предикат не загружается в предикат предиката. (Да, предикат Editor подключен как IBOutlet)

1 ответ

Решение

Установить objectValue собственность NSPredicateEditor к предикату в вопросе.

В документации есть это описание процесса загрузки; Кажется ли что-нибудь из этого может вызвать проблемы с вашей настройкой?

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

После настройки редактора предикатов вы обычно отправляете ему сообщение setObjectValue: для восстановления сохраненного предиката. NSPredicateEditor должен определить, какой из его шаблонов должен отображать каждый предикат в дереве предикатов. Для этого он отправляет каждому из своих шаблонов строк сообщение matchForPredicate: и выбирает тот, который возвращает наибольшее значение.

После нахождения наилучшего соответствия для предиката, NSPredicateEditor копирует этот шаблон для получения свежих представлений, вставляет их в соответствующую строку, а затем устанавливает предикат в шаблоне с помощью setPredicate:. В этом методе объект NSPredicateEditorRowTemplate должен установить значения своих представлений для представления этого предиката.

Затем NSPredicateEditorRowTemplate запрашивает у шаблона "отображаемые предикаты" предиката, отправляя сообщение displayableSubpredicatesOfPredicate:. Если шаблон представляет предикат полностью или если предикат не имеет субпредикатов, он может вернуть ноль для этого. В противном случае он должен возвращать список предикатов, которые должны быть преобразованы в подстроки строки этого шаблона. The whole process repeats for each sub-predicate.

Другие вопросы по тегам