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