由于所有这些日历风格的NSDatePicker
占用了大量空间,我决定将它们放在视图控制器中,使用按钮显示日期本身,点击后使用{{1在弹出窗口中显示日历。
然后我使用绑定将NSPopover
子类的NSButton
属性与date
当前选择的NSArrayController
类型属性相链接。然后传播到日历样式的日期选择器,反之亦然。对于“其他方式”,而不是使用KVO,我只是实现自定义setter,所以如果有人在按钮或日历视图控制器上设置NSDate
的值(也许绑定到数组控制器设置按钮的值,所以按钮设置日历视图控制器的值;也许日历上的更改设置视图控制器的值;谁知道) - 然后我传播更改。
这一切都很好地工作......除了一件事。
多重选择。
您会看到,在用户执行多项选择后,系统立即决定告诉我的按钮现在选择date
。为了传播更改,我告诉所有受约束的观察者,该值已更改为nil
。其中一个受约束的观察者是nil
,目前有多个项目被选中。
有什么问题?将当前选择的绑定密钥路径设置为NSArrayController
会导致将所选日期中的所有日期设置为nil
...将更改传播到数据库中。并且用户甚至没有将值设置为nil
- 它仅仅是进行多次选择而不是做出任何选择而传播,并且它应该仅用于显示此值。
值得庆幸的是,我现在无需为这些日历支持多种选择。我只是通过使用nil
比较观察对象的观察到的关键路径值来检测NSMultipleSelectionMarker
。如果进行了多次选择,我会将值应用于ivar,但我没有“双向”通知其他绑定对象的更改。
但是 - 如果我想支持用户选择多个文档,然后立即更改所有发布日期(因为用户可以使用标准isEqual:
中完成的绑定实现,{{ 1}} et al) - 如果没有创建多个选择的行为也会如何传播虚假更改(例如将NSDatePicker
设置为所有选定对象?),我将如何这样做?
(注意:虽然编写这个问题是为了反映我当前需要重用标准控件:按钮,弹出窗口,日期选择器 - 但不限于此类重用。我可能想要实现完全自定义明天的函数图小部件需要双向Cocoa绑定。)
以下是NSTextField
的几个相关代码块:
nil