簡體   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