在自定义控件上正确实现自定义绑定

时间:2012-09-18 12:31:20

标签: objective-c macos cocoa-bindings foundation

由于所有这些日历风格的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

0 个答案:

没有答案