使用 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】:将NSPredicateEditor
的objectValue
属性设置为相关谓词。
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 添加到 NSScrollView 时出现 UI 故障