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

时间:2019-05-03 06:55:49

标签: swift macos cocoa cocoa-bindings

我正在Mac上开发一个现有的Swift / Objective-C项目,并且正在用代码创建一些UI。我基于NSTableView中的选择启用了一个按钮,该按钮使用NSArrayController(由于某些原因)进行管理。

我在selectionIndexes上有一个属性MyController

@objc var selectionIndexes : IndexSet = IndexSet()

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

我使用以下方法连接按钮的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)

这似乎很la脚。有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

@objc对于将属性公开给Objective-C运行时是必需的。

要遵守属性键值,您必须添加dynamic关键字

@objc dynamic var selectionIndexes = IndexSet()

并删除...ChangeValue(for