1

在 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])
}

这有效,但不会持续更新,除非我在界面构建器的检查器中为滑块设置了“连续”复选框。我的问题是我想设置其他不公开连续设置的属性之间的绑定,特别是两个 NSTableColumn 实例。是否可以通过在绑定代码中设置选项来连续绑定?

4

1 回答 1

1

您的问题的简短回答是否定的,这是不可能的。您应该只使用您已经发现的自己的 KVO 代码。

更长的答案如下:

从根本上说,问题有两个:NSTableColumn没有continuous财产。有些类可以(例如NSControlNSCell),但NSTableColumn不从这些类继承。从技术上讲,此属性旨在确定控件是否将其操作方法连续发送到其目标,而不是专门用于绑定,尽管它也会影响绑定行为。

绑定选项的.continuouslyUpdatesValue含义略有不同。它用于确定绑定值是在用户交互期间持续更新还是仅在 UI 元素退出其响应者状态(即用户交互停止)时更新。这对于文本字段/视图绑定非常有用。

不幸的是,至少在传统意义上,NSTableColumn不能真正成为响应者。NSTableColumn并且此选项对来自's 的绑定没有影响width

令人困惑的是,此选项来自NSSlider. 相反,如果NSSlider' 的continuous属性是false,它总是只会在鼠标上移时更新绑定,即使在绑定上设置了.continuouslyUpdatesValue选项。相反,如果NSSlidercontinuous属性是true,它总是会不断更新绑定的值,即使绑定上的.continuouslyUpdatesValue选项设置为 false 也是如此。

使用调试器进行的一些挖掘解释了这种行为。NSSlider总是将其绑定值更新为将其操作发送到其目标的副作用(无论.continuouslyUpdatesValue选项如何)。这就解释了为什么它的continuous属性完全决定了它的行为。

另一方面,虽然NSTableColumn更新它的width 属性并因此随着它的宽度变化而不断地发出 KVO 通知,它只是更新它的width 绑定columnDidResizeNotification作为发布它在宽度变化时发布的副作用。此通知仅在调整大小结束时发布,而不是在调整大小期间发布。因此,NSTableColumn仅在调整大小结束时更新其绑定。

于 2019-11-19T23:25:40.160 回答