gpt4 book ai didi

objective-c - 是否可以以编程方式绑定(bind)两个关键路径,在 Cocoa 中设置连续更新?

转载 作者:行者123 更新时间:2023-12-03 17:08:55 26 4
gpt4 key购买 nike

在 macOS Cocoa 应用程序中,如果我有两个 NSSlider 对象,我可以通过编程方式设置以下绑定(bind):

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

这可以工作,但不能持续更新,除非我在 slider 的界面生成器的检查器中设置“连续”复选框。我的问题是我想设置其他属性之间的绑定(bind),这些属性本身不公开连续设置,特别是两个 NSTableColumn 实例。是否可以通过在绑定(bind)代码中设置选项来连续绑定(bind)?

最佳答案

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

更长的答案如下:

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

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

不幸的是,NSTableColumn 不能真正成为响应者,至少在传统意义上是这样。此选项对 NSTableColumnwidth 的绑定(bind)没有影响。

令人困惑的是,此选项对来自 NSSlider 的绑定(bind)没有影响。相反,如果 NSSlidercontinuous 属性为 false,它始终只会更新鼠标松开时的绑定(bind),即使 在绑定(bind)上设置 .ContinouslyUpdatesValue 选项。相反,如果 NSSlidercontinuous 属性为 true,它将始终连续更新绑定(bind)的值,即使绑定(bind)上的 .ContinouslyUpdatesValue 选项设置为 false。

使用调试器进行一些挖掘可以解释这种行为。 NSSlider 始终更新其绑定(bind)值,作为将其操作发送到目标的副作用(无论 .continuouslyUpdatesValue 选项如何)。这解释了为什么其连续属性仅决定其行为。

另一方面,虽然 NSTableColumn 更新其 width property 并因此在其宽度更改时连续发出 KVO 通知,但它仅更新其宽度 绑定(bind)是发布 columnDidResizeNotification 的副作用它发布宽度变化。此通知仅在调整大小结束时发布,而不是在调整大小期间发布。因此,NSTableColumn 仅在调整大小结束时更新其绑定(bind)。

关于objective-c - 是否可以以编程方式绑定(bind)两个关键路径,在 Cocoa 中设置连续更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58922741/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com