代码之家  ›  专栏  ›  技术社区  ›  Dave DeLong

使用nspredicateeditor编辑nspredicate

  •  2
  • Dave DeLong  · 技术社区  · 15 年前

    我可以使用nspredicateeditor(nsruleeditor的子类)轻松创建nspredicate。我想知道的是:

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

    编辑:我尝试了@john关于使用setObjectValue:的建议,但没有完全成功。让我再解释一下我的设置:

    我有一个基于文档的Cocoa应用程序,文档窗口上只有一个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)

    1 回复  |  直到 15 年前
        1
  •  6
  •   John Calsbeek    15 年前

    设置 objectValue 性质 NSPredicateEditor 到有疑问的谓词。

    这个 documentation 是否有加载过程的描述;其中任何一个描述是否可能导致安装程序出现问题?

    首先,一个实例 创建了nspredicateeditor,并且 行模板在其上设置,或者 通过NIB文件或 以编程方式。第一件事 谓词编辑器做的是询问 视图的模板,使用 模板浏览。

    在设置谓词编辑器之后, 您通常会发送一个 setObjectValue:要还原的消息 已保存谓词。nspredicateeditor(nspredicateeditor) 需要确定 模板应显示每个 谓词树中的谓词。它 这是通过发送每一行 模板matchForPredicate:message 选择一个返回 最高值。

    在找到最佳匹配后 谓词,nspredicateeditor副本 获取新视图的模板, 将它们插入到适当的行中,并且 然后将谓词设置在 使用setPredicate的模板:。在 这种方法, nsPredicateEditorRowTemplate对象 必须将其视图值设置为 表示该谓词。

    nsPredicateEditorRowTemplate下一个任务 __可显示的模板 谓词的子谓词__ 发送一个 谓词的可显示子项: 消息。如果模板表示 谓词的整体,或者如果 谓词没有子程序,它可以 为此返回零。否则,它 应将谓词列表返回到 被分成几行 模板的行。整个过程 为每个子谓词重复。