NSPredicateEditorRowTemplate用于日期比较

时间:2010-03-10 21:12:32

标签: objective-c cocoa date nspredicateeditor

我正在构建NSPredicateEditor,我希望能够进行高级日期比较。

我意识到我可以使用NSPredicateEditorRowTemplate rightExpressionType来构建NSDateAttributeType,但我想构建的谓词需要比这更先进。

例如,我需要基本比较,如:

  • dateKeypath < aDate
  • dateKeypath <= aDate
  • dateKeypath = aDate
  • dateKeypath != aDate
  • dateKeypath > aDate
  • dateKeypath >= aDate

这些基本比较很容易实现,我有这些工作。但是,我还需要进行比较,如:

  • dateKeypath isInTheLast n days(或数周,数月,数年)
  • dateKeypath isNotInTheLast n days(或数周,数月,数年)
  • dateKeypath between aDate and anotherDate

我如何实现这些比较?我知道我需要创建一个自定义NSPredicateEditorRowTemplate,但我没有找到任何关于如何实现此类目标的明确文档。

修改 奖励积分也可用于了解如何使这些比较成为完整的日期 - 时间(年 - 月 - 日 - 时 - 分 - 秒)比较(因为NSDateAttributeType仅具有年 - 月 - 日的粒度)。

2 个答案:

答案 0 :(得分:8)

回想起来,这个答案似乎有些明显:

我实际上描述了 3 谓词编辑器行模板,而不是一个。这三个模板是:

  • dateKeyPath [<, <=, =, >, >=, !=] [NSDatePicker]
  • dateKeyPath [inTheLast, notInTheLast] [NSTextField] [NSPopUpButton]
  • dateKeyPath [between] [NSDatePicker] "and" [NSDatePicker]

如果您构建这三个谓词编辑器行模板并将它们提供给predicateEditor,编辑器将意识到它们都使用相同的dateKeyPath,然后显示然后将所有操作符压缩到一个弹出按钮中。然后,它将根据选择的运算符将操作员右侧的实际视图切换出来。

修改

对于奖励积分:您可以通过覆盖templateViews方法,从super检索templateViews,并在相应的选择器上设置datePickerElements来修改日期选择器的精确度。 / p>

2010年11月24日编辑

对于再次遇到此问题的人,我写了一些关于创建自定义NSPredicateEditorRowTemplates的博文:

答案 1 :(得分:0)

我认为第二个谓词模板不会按预期工作。问题是您需要一个相对日期 - 相对于当前日期评估的日期。

我已经基于Apple工程师的一些代码(和建议)实现了这样一个谓词编辑器模板(包含所有相关代码)。如果有人有兴趣我可以提供详细信息等。我的实施非常复杂。