[英]macOS Swift: How to bind NSDocument variable to custom NSView variable
我有一个带有一个变量的简单自定义NSView
:
class MyView: NSView {
var color: NSColor!
}
在我的NSDocument
我有相同的变量。
当前,我正在使用NSViewController
,当变量更改时,该NSViewController
通过NSObjectProtocol
从文档接收消息。 这意味着我已经通过默认的NotificationCenter
设置了通知。 然后,控制器在我的视图中通过IBOutlet
设置颜色。
效果很好,但是给我留下了很多胶合代码。
我当时想我可以使用NSObjectController
并将其绑定到文档中的颜色。 然后将我的颜色从视图绑定到objectController。
可能是我出了些问题,因为我很难访问甚至无法在视图中找到颜色变量。 它不会显示在Interface Builder故事板上。
我想知道如何准备我认为该变量可绑定?
由于KVC和KVO是在Objective-C运行时上构建的,并且由于Cocoa绑定是在KVC和KVO之上构建的,因此要使用Cocoa绑定的任何属性都必须公开给Objective-C。 至少,这意味着在声明中添加@objc
:
@objc var color: NSColor!
但是,如果可以在运行时更改color
属性,则还需要克服其他障碍。 您需要确保在调用属性的setter时将触发KVO通知。 苹果公司(Apple)的KVO实现将使用Objective-C魔术来自动向设置器添加所需的通知,但是由于不能保证Swift属性访问会通过Objective-C运行时,因此您需要添加dynamic
关键字才能可靠地工作:
@objc dynamic var color: NSColor!
如果color
是一个依赖于其他内容的计算属性,请keyPathsForValuesAffecting<Key>
设置一个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绑定东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.