在macOS Cocoa应用程序中,如果我有两个NSSlider对象,则可以通过编程方式设置以下绑定:
@IBOutlet weak var firstSlider: NSSlider!
@IBOutlet weak var secondSlider: NSSlider!
func applicationDidFinishLaunching(_ aNotification: Notification) {
// Insert code here to initialize your application
self.firstSlider.bind(NSBindingName.init(rawValue: "value"), to: self.secondSlider, withKeyPath: "value", options: [NSBindingOption.continuouslyUpdatesValue : true])
}
这是有效的,但不能持续更新,除非我在界面构建器的检查器中为滑块设置了Continuous复选框。我的问题是,我想设置其他自身不公开连续设置的属性之间的绑定,特别是两个NSTableColumn实例。通过在绑定代码中设置选项是否可以连续绑定?
您的问题的简短答案是不,这是不可能的。您应该只使用已经发现的自己的KVO代码。
更长的答案如下:
从根本上讲,问题有两个方面:NSTableColumn
没有continuous
属性。有一些类可以执行(例如continuous
和NSControl
),但是NSCell
不会从这些类继承。从技术上讲,此属性旨在确定控件是否连续地将其[[操作方法传递给其目标]],而不是专门关于绑定,尽管它也会影响绑定行为。NSTableColumn
绑定选项的含义略有不同。它用于确定绑定值是在用户交互期间是否连续更新,还是仅在UI元素退出其响应者状态(即,用户交互停止)时才更新。这对于文本字段/视图绑定最有用。
不幸的是,至少在传统意义上,.continuouslyUpdatesValue
不能
真正
成为响应者。并且此选项对从.continuouslyUpdatesValue
的NSTableColumn
进行的绑定无效。令人困惑的是,此选项also
对来自NSTableColumn
的绑定无效。相反,如果width
的NSSlider
属性为NSSlider
,它将始终仅在鼠标向上移动时更新绑定,即使在绑定上设置了continuous
选项。相反,如果false
的.continuouslyUpdatesValue
属性为NSSlider
,它将始终不断更新绑定的值,即使在绑定上将continuous
选项设置为false。一些通过调试器进行的挖掘解释了此行为。 true
始终会更新其绑定值,这是将其操作发送到其目标的副作用(无论.continuouslyUpdatesValue
选项如何)。这解释了为什么其NSSlider
属性仅决定其行为。另一方面,虽然.continuouslyUpdatesValue
更新其continuous
属性
并因此随着宽度的变化而连续发出KVO通知,但由于NSTableColumn
的副作用,它仅更新其width
binding张贴它在宽度变化上发布的width
。该通知仅在调整大小结束时发布,而不在调整大小期间发布。因此,columnDidResizeNotification
仅在调整大小的末尾更新其绑定。