繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM