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
行
我正在 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
行