使用NSPredicateEditor编辑NSPredicate

Dav*_*ong 2 cocoa objective-c nspredicateeditor nspredicate

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

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

编辑:我试过@John关于使用setObjectValue:的建议,但这并不是很有效.让我解释一下我的设置:

我有一个基于文档的可可应用程序,而文档窗口上只有一个NSPredicateEditor.在dataOfType:error:方法中,我有:

NSPredicate * pred = [predicateEditor objectValue];
NSData * predicateData = [NSKeyedArchiver archivedDataWithRootObject:pred];
return predicateData;
Run Code Online (Sandbox Code Playgroud)

readFromData:ofType:error:方法中,我有:

NSPredicate * pred = [NSKeyedUnarchiver unarchiveObjectWithData:data];
[predicateEditor setObjectValue:pred];
return (pred != nil);
Run Code Online (Sandbox Code Playgroud)

我已经验证谓词正确归档和取消归档,但在打开保存的谓词后,谓词不会加载到predicateEditor中.(是的,谓词编辑器被连接为IBOutlet)

Joh*_*eek 6

设置相关谓词的objectValue属性NSPredicateEditor.

文档具有装载过程的描述; 这有什么看起来可能会导致您的设置出现问题?

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

设置谓词编辑器后,通常会向其发送setObjectValue:消息以恢复已保存的谓词.NSPredicateEditor需要确定哪些模板应该在谓词树中显示每个谓词.它通过向每个行模板发送matchForPredicate:消息并选择返回最高值的消息来完成此操作.

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

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

  • 我发现了发生了什么!当我打开文档(存档的谓词)并尝试读取它时,尚未加载笔尖.我延迟设置编辑器的objectValue直到加载了nib,然后它完美地工作.谢谢你的帮助,约翰! (2认同)