gpt4 book ai didi

swift - macOS swift : How to bind NSDocument variable to custom NSView variable

转载 作者:行者123 更新时间:2023-11-28 15:00:23 24 4
gpt4 key购买 nike

我有一个带有一个变量的简单自定义 NSView:

class MyView: NSView {
var color: NSColor!
}

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

目前我使用的是 NSViewController,它在变量更改时通过 NSObjectProtocol 从文档接收消息。这意味着我已经通过默认的 NotificationCenter 设置了通知。然后 Controller 通过 IBOutlet 在我的 View 中设置颜色。

效果很好,但给我留下了很多胶水代码。

我想我可以使用 NSObjectController 并将其绑定(bind)到我文档中的颜色。然后将我的颜色从 View 绑定(bind)到 objectController。

可能是我弄错了,因为我很难访问甚至找不到 View 中的颜色变量。它不会出现在 Interface Builder Storyboard中。

我想知道如何在我的 View 中准备可绑定(bind)的变量?!

最佳答案

由于 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 }

这将导致 color 的通知如果 foo 将被解雇变化。

无论如何,一旦您的属性符合 KVC,您就应该能够从 Interface Builder 将内容绑定(bind)到它。

关于swift - macOS swift : How to bind NSDocument variable to custom NSView variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48968103/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com