swift - macOS:向 Cocoa 绑定(bind)公开 Swift 属性的正确方法

标签 swift macos cocoa cocoa-bindings

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

我在 MyController 上有一个属性 selectionIndexes:

@objc var selectionIndexes : IndexSet = IndexSet()

我不确定 @objc 是否是使其对 Cocoa Bindings 系统可见所必需的。

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

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

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

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

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

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

最佳答案

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

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

@objc dynamic var selectionIndexes = IndexSet()

并删除 ...ChangeValue(for

关于swift - macOS:向 Cocoa 绑定(bind)公开 Swift 属性的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55964697/

相关文章:

ios - 是否可以在不复制所有代码的情况下复制 iOS 应用程序?

swift - ScrollView 与 StackView 内部以编程方式不滚动

c++ - gethostbyaddr() 函数是否使用互联网将 IP 地址转换为主机名?

objective-c - Mac OS X 开发的替代范例

macos - 是否可以将 Google Chrome Canary 设置为 OS X Yosemite 上的默认浏览器?

Cocoa MVC ≠ 实际的 MVC?

Swift 删除按钮 BottomBorder

ios - 如何在 Xcode 中隐藏代码文档/注释?

swift - FIRStorageReference 观察 Swift 的变化

cocoa-touch - 了解 bundle 框架和库