I'm building an NSPredicateEditor
, and I want the ability to do advanced date comparison.
I realize that I can build an NSPredicateEditorRowTemplate
with a rightExpressionType
of NSDateAttributeType
, but the predicates I want to build need to be much more advanced than that.
For example, I need to basic comparison like:
dateKeypath < aDate
dateKeypath <= aDate
dateKeypath = aDate
dateKeypath != aDate
dateKeypath > aDate
dateKeypath >= aDate
These basic comparisons are quite easy to achieve, and I have these working. However, I also need to do comparisons like:
dateKeypath isInTheLast n days
(or weeks, months, years)dateKeypath isNotInTheLast n days
(or weeks, months, years)dateKeypath between aDate and anotherDate
How can I achieve these sorts of comparisons? I understand that I'll need to create a custom NSPredicateEditorRowTemplate
, but I haven't found any clear documentation on how to achieve something like this.
EDIT
Bonus points are available for also knowing how to make these comparisons a full date-time (year-month-day-hour-minute-second) comparison (as NSDateAttributeType
only has year-month-day granularity).
In retrospect, this answer seems somewhat obvious:
I actually described 3 predicate editor row templates, not one. The three templates are:
dateKeyPath [<, <=, =, >, >=, !=] [NSDatePicker]
dateKeyPath [inTheLast, notInTheLast] [NSTextField] [NSPopUpButton]
dateKeyPath [between] [NSDatePicker] "and" [NSDatePicker]
If you build these three predicate editor row templates and give them to the predicateEditor, the editor will realize that they're all using the same
dateKeyPath
, and display then crunch all their operators into a single popup button. It will then switch out the actual views to the right of the operator depending on which operator is selected.Edit
For bonus points: you can modify the precision of the date pickers by overriding the
templateViews
method, retrieving the templateViews fromsuper
, and setting thedatePickerElements
on the appropriate pickers.Edit 24 Nov 2010
For anyone who comes across this again, I've written a couple blog posts on creating custom
NSPredicateEditorRowTemplates
:NSPredicateEditorRowTemplate
NSPredicateEditorRowTemplate
(this one shows how to do theinTheLast
andinTheNext
row template)