macOS:将 Swift 属性公开给 Cocoa 绑定的正确方法

macOS: Correct way of exposing Swift properties to Cocoa Bindings

我正在 Mac 上的一个现有 Swift/Objective-C 项目上工作,我正在用代码创建一些 UI。我根据 NSTableView 中的选择启用了一个按钮,我管理 without 使用 NSArrayController(出于某些原因)。

我在 MyController 上有一个 属性 selectionIndexes:

@objc var selectionIndexes : IndexSet = IndexSet()

我不确定 @objc 是否有必要使其对 Cocoa 绑定系统可见。

我使用以下方式连接按钮的 enabled 绑定:

newButton.bind(NSBindingName.enabled, to: MyController.sharedInstance,
     withKeyPath: "selectionIndexes", 
     options: [NSBindingOption.valueTransformer : MyTransformer()])

这工作正常,使用正确的 属性 调用转换器并正确设置启用,但是对选择的更改不会触发绑定 ,因此按钮保持禁用状态。

我必须明确地告诉系统我正在更改值,例如

self.willChangeValue(for: \.selectionIndexes )
self.selectionIndexes = proposedSelectionIndexes
self.didChangeValue(for: \.selectionIndexes)

这看起来很蹩脚。有更好的方法吗?

@objc 是将 属性 暴露给 Objective-C 运行时所必需的。

要使 属性 键值观察兼容,您必须添加 dynamic 关键字

@objc dynamic var selectionIndexes = IndexSet()

并删除 ...ChangeValue(for