【问题标题】:macOS: Correct way of exposing Swift properties to Cocoa BindingsmacOS:将 Swift 属性公开给 Cocoa 绑定的正确方法
【发布时间】:2019-05-03 06:55:48
【问题描述】:

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

我在MyController 上有一个属性selectionIndexes

@objc var selectionIndexes : IndexSet = IndexSet()

我不确定是否需要 @objc 才能使其对 Cocoa Bindings 系统可见。

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

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

【问题讨论】:

    标签: swift macos cocoa cocoa-bindings


    【解决方案1】:

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

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

    @objc dynamic var selectionIndexes = IndexSet()
    

    并删除...ChangeValue(for

    【讨论】:

    • 谢谢。做到了。
    猜你喜欢
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 2014-12-25
    • 2013-05-04
    相关资源
    最近更新 更多