2009-08-12 52 views
2

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

如何获取现有的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); 

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

+0

您使用自定义模板吗? – 2009-08-12 21:54:30

+0

@John不,我只是从IB库中拖放了一个PredicateEditor。 – 2009-08-12 21:56:13

回答

5

NSPredicateEditorobjectValue属性设置为所讨论的谓词。

documentation有这种加载过程的说明;有没有看起来像这可能会导致您的设置出现问题?

首先, NSPredicateEditor的实例被创建的,有些 行模板就可以了,要么 通过笔尖文件或 编程设置。谓词编辑器 所做的第一件事是使用 模板视图向 中的每个模板查询它们的视图。

设置谓词编辑器 后,通常会发送一个 setObjectValue:消息来还原 保存的谓词。 NSPredicateEditor 需要确定它的哪个 模板应该在谓词树中显示每个 谓词。它 通过发送它的每个行 模板一个matchForPredicate:消息 并选择一个返回 最高值。

找到最佳匹配的 谓语之后,NSPredicateEditor副本 该模板得到新鲜的观点, 将它们插入到适当的行, 然后设置在 模板使用setPredicate谓语:。在 该方法中,NSPredicateEditorRowTemplate对象 必须将其视图的值设置为 表示该谓词。 消息:

NSPredicateEditorRowTemplate未来通过 发送 displayableSubpredicatesOfPredicate要求 的谓词的“显示 子谓词”的模板。如果模板完整地表示谓词 谓词,或者谓词没有子谓词,则其 可以返回零。否则,它 应该返回一个谓词列表 被做成该 模板行的子行。整个过程 为每个子谓词重复。

+0

用这个建议的更多信息编辑了这个问题。 – 2009-08-12 21:50:43

+0

围绕谷歌,似乎有'NSPredicateEditor'一个或两个怪癖,但我找不到任何会导致编辑完全忽略'-setObjectValue:'的。 – 2009-08-12 22:00:39

+0

@John(编辑之后):我可能是个问题。我刚从IB库下载了一个NSPredicateEditor到窗口中,并将它连接到MyDocument File的Owner。我是否需要对NSPredicateEditorRowTemplates做任何特殊的事情,或者应该使用默认的工作? – 2009-08-12 22:03:27