macOS Swift:如何将 NSDocument 变量绑定到自定义 NSView 变量



我有一个简单的自定义NSView,其中包含一个变量:

class MyView: NSView {
var color: NSColor!
}

在我的NSDocument中,我有相同的变量。

目前,我正在使用一种NSViewController,当变量更改时,该NSObjectProtocol通过文档接收消息。这意味着我已经在默认NotificationCenter上设置了通知。然后控制器在我的视图中设置颜色IBOutlet.

这工作得很好,但给我留下了很多胶水代码。

我想我可以使用NSObjectController并将其绑定到文档中的颜色。然后将我的颜色从视图绑定到对象控制器。

可能我弄错了什么,因为我很难访问甚至找到视图中的颜色变量。它不会显示在界面生成器情节提要中。

我想知道如何准备我眼中的变量以绑定?!

由于KVC和KVO是在Objective-C运行时构建的,并且由于Cocoa Bindings建立在KVC和KVO之上,因此您想要使用Cocoa Bindings的任何属性都需要向Objective-C公开。至少,这意味着在声明中添加@objc

@objc var color: NSColor!

但是,如果可以在运行时更改color属性,则需要跳过另一个障碍;您需要确保每当调用属性的 setter 时都会触发 KVO 通知。Apple 的 KVO 实现将使用 Objective-C 魔术自动将所需的通知添加到 setter 中,但由于 Swift 属性访问不能保证通过 Objective-C 运行时,因此您需要添加dynamic关键字才能可靠地工作:

@objc dynamic var color: NSColor!

如果color是依赖于其他内容的计算属性,请设置一个keyPathsForValuesAffecting<Key>静态属性(向 Objective-C 公开)让 KVO 知道依赖关系:

@objc dynamic var foo: NSColor!
@objc private static let keyPathsForValuesAffectingColor: Set<String> = [#keyPath(foo)]
@objc var color: NSColor! { return self.foo }

这将导致在foo更改时触发color通知。

无论如何,一旦你的属性符合KVC,你应该能够从Interface Builder绑定到它。

最新更新