Редактирование 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.