是否有可能通过编程方式绑定两个关键路径,从而在Cocoa中设置连续更新?

问题描述 投票:1回答: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])
}

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

objective-c swift cocoa cocoa-bindings nstablecolumn
1个回答
0
投票

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

更长的答案如下:

从根本上讲,问题有两个方面:NSTableColumn没有continuous属性。有一些类可以执行(例如continuousNSControl),但是NSCell不会从这些类继承。从技术上讲,此属性旨在确定控件是否连续地将其[[操作方法传递给其目标]],而不是专门关于绑定,尽管它也会影响绑定行为。NSTableColumn绑定选项的含义略有不同。它用于确定绑定值是在用户交互期间是否连续更新,还是仅在UI元素退出其响应者状态(即,用户交互停止)时才更新。这对于文本字段/视图绑定最有用。

不幸的是,至少在传统意义上,.continuouslyUpdatesValue不能

真正

成为响应者。并且此选项对从.continuouslyUpdatesValueNSTableColumn进行的绑定无效。令人困惑的是,此选项

also

对来自NSTableColumn的绑定无效。相反,如果widthNSSlider属性为NSSlider,它将始终仅在鼠标向上移动时更新绑定,即使在绑定上设置了continuous选项。相反,如果false.continuouslyUpdatesValue属性为NSSlider,它将始终不断更新绑定的值,即使在绑定上将continuous选项设置为false。
一些通过调试器进行的挖掘解释了此行为。 true始终会更新其绑定值,这是将其操作发送到其目标的副作用(无论.continuouslyUpdatesValue选项如何)。这解释了为什么其NSSlider属性仅决定其行为。

另一方面,虽然.continuouslyUpdatesValue更新其continuous

属性

并因此随着宽度的变化而连续发出KVO通知,但由于NSTableColumn的副作用,它仅更新其width binding张贴它在宽度变化上发布的width。该通知仅在调整大小结束时发布,而不在调整大小期间发布。因此,columnDidResizeNotification仅在调整大小的末尾更新其绑定。
© www.soinside.com 2019 - 2024. All rights reserved.