我正在构建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
仅具有年 - 月 - 日的粒度)。
答案 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
的博文:
NSPredicateEditorRowTemplate
NSPredicateEditorRowTemplate
(此处显示如何执行inTheLast
和inTheNext
行模板)答案 1 :(得分:0)
我认为第二个谓词模板不会按预期工作。问题是您需要一个相对日期 - 相对于当前日期评估的日期。
我已经基于Apple工程师的一些代码(和建议)实现了这样一个谓词编辑器模板(包含所有相关代码)。如果有人有兴趣我可以提供详细信息等。我的实施非常复杂。