2

我可以使用 NSPredicateEditor(NSRuleEditor 的子类)轻松创建 NSPredicate。我想知道的是:

如何获取现有的 NSPredicate(由编辑器创建的)并将其重新加载到编辑器中以便我可以更改它?

编辑:我尝试了@John 的使用 setObjectValue: 的建议,但这并不太奏效。让我再解释一下我的设置:

我有一个基于 Document 的 cocoa 应用程序,并且 Document 窗口上只有一个 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 连接为 IBOutlet)

4

1 回答 1

6

将 的objectValue属性设置为NSPredicateEditor有问题的谓词。

文档有这个加载过程的描述;这是否会导致您的设置出现问题?

首先,创建 NSPredicateEditor 的实例,并在其上设置一些行模板——通过 nib 文件或以编程方式。谓词编辑器做的第一件事是使用 templateViews 询问每个模板的视图。

设置谓词编辑器后,您通常会向其发送 setObjectValue: 消息以恢复已保存的谓词。NSPredicateEditor 需要确定它的哪个模板应该显示谓词树中的每个谓词。它通过向每个行模板发送一个 matchForPredicate: 消息并选择返回最高值的那个来做到这一点。

在找到谓词的最佳匹配后,NSPredicateEditor 复制该模板以获取新视图,将它们插入到正确的行中,然后使用 setPredicate: 在模板上设置谓词。在该方法中,NSPredicateEditorRowTemplate 对象必须设置其视图的值来表示该谓词。

NSPredicateEditorRowTemplate 接下来通过发送 displayableSubpredicatesOfPredicate: 消息向模板询问谓词的“可显示子谓词”。如果一个模板完整地表示一个谓词,或者如果谓词没有子谓词,它可以为此返回 nil。否则,它应该返回一个谓词列表,这些谓词将构成该模板行的子行。对每个子谓词重复整个过程。

于 2009-08-12T21:25:11.767 回答