使用 NSPredicateEditor 编辑 NSPredicate

Posted

技术标签:

【中文标题】使用 NSPredicateEditor 编辑 NSPredicate【英文标题】:Editing an NSPredicate using NSPredicateEditor 【发布时间】:2009-08-12 21:18:14 【问题描述】:

我可以使用 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)

【问题讨论】:

您在使用自定义模板吗? @John 不,我只是从 IB 库中拖放了一个 PredicateEditor。 【参考方案1】:

NSPredicateEditorobjectValue 属性设置为相关谓词。

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

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

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

找到最佳匹配后 谓词,NSPredicateEditor 副本 获取新鲜视图的模板, 将它们插入到正确的行中,并且 然后将谓词设置在 使用 setPredicate: 的模板。之内 这种方法, NSPredicateEditorRowTemplate 对象 必须将其视图的值设置为 表示那个谓词。

NSPredicateEditorRowTemplate 下一个询问 “可显示的”模板 谓词的子谓词” 发送一个 displayableSubpredicatesOfPredicate: 信息。如果一个模板代表一个 谓词的整体,或者如果 谓词没有子谓词,它可以 为此返回 nil。否则,它 应该返回一个谓词列表 被做成那个的子行 模板的行。整个过程 对每个子谓词重复。

【讨论】:

编辑了问题,提供了有关此建议的更多信息。 在 Google 上一探究竟,NSPredicateEditor 似乎有一两个怪癖,但我找不到任何会导致编辑完全忽略 -setObjectValue: 的怪癖。 @John(编辑后):我可能是个问题。我刚刚从 IB 库中将一个 NSPredicateEditor 放到窗口中,并将其连接到 MyDocument 文件的所有者。我是否需要对 NSPredicateEditorRowTemplates 做任何特别的事情,还是应该使用默认的? 你可能需要给它一些NSPredicateEditorRowTemplates,但你应该能够在Interface Builder中做到这一点。 我发现了怎么回事!当我打开一个文档(归档谓词)并尝试阅读它时,笔尖尚未加载。我延迟设置编辑器的 objectValue 直到 nib 被加载,然后它完美地工作。谢谢你的帮助,约翰!

以上是关于使用 NSPredicateEditor 编辑 NSPredicate的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicateEditor 不处理整数值

将 NSPredicateEditor 添加到 NSScrollView 时出现 UI 故障

NSPredicateEditor 是不可见的

如何将 NSPredicateEditor/NSRuleEditor 背景设置为交替行?

NSPredicateEditor 只是不会出现

如何持久化 NSPredicateEditor NSPredicateEditorRowTemplates 数据