2009-08-12 7 views
2

Я могу легко создать NSPredicate с помощью NSPredicateEditor (подкласс NSRuleEditor). Я хотел бы знать следующее:Редактирование NSPredicate с использованием NSPredicateEditor

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

EDIT: Я попробовал @ предложение Джона об использовании 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); 

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

+0

Вы используете пользовательские шаблоны? –

+0

@ John no Я просто потащил и отбросил PredicateEditor из библиотеки IB. –

ответ

5

Задайте objectValue свойство NSPredicateEditor на предикат, о котором идет речь.

documentation имеет описание этого процесса загрузки; похоже ли это может вызвать проблемы с вашей настройкой?

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

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

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

NSPredicateEditorRowTemplate следующий спрашивает шаблона для «изображаемых суба-предикатов» предиката путем отправки displayableSubpredicatesOfPredicate : сообщения.Если шаблон представляет собой предикат целиком, или если предикат не имеет субпредактов, он может вернуть нуль для этого. В противном случае это должно вернуть список предикатов в подстроки строки . Весь процесс повторяется для каждого под-предиката.

+0

Отредактированный вопрос с дополнительной информацией относительно этого предложения. –

+0

Похоже, что у Google есть один или два причуды с «NSPredicateEditor», но я не могу найти ничего, что заставит редактора полностью игнорировать '-setObjectValue:'. –

+0

@John (после редактирования): Я могу быть проблемой. Я просто уронил NSPredicateEditor из библиотеки IB в окно и подключил его к владельцу файла MyDocument. Нужно ли мне что-то делать с NSPredicateEditorRowTemplates или работать по умолчанию? –