你會希望你的視圖控制器有一些明確的模型/狀態這些滑塊的值有什麼。例如
class ViewController : NSViewController {
var value: Double
}
然後,您可以連接滑塊和文本字段以更新或顯示此值。
方法1:目標/動作/的SetValue
在此之前使用,你已經開始明確IBActions的。爲響應這一行動,我們會從滑塊拉的doubleValue並從更新視圖控制器的型號:
@IBAction func sliderValueChanged(_ sender: NSSlider) {
value = sender.doubleValue
}
第二件更新一切以反映新的價值。隨着斯威夫特,我們可以只使用didSet
觀察者的視圖控制器的價值屬性,知道什麼時候它的變化和更新所有的控制,e.g:
@IBOutlet weak var touchBarSlider: NSSlider!
@IBOutlet weak var windowSlider: NSSlider!
@IBOutlet weak var windowTextField: NSTextField!
var value: Double {
didSet {
touchBarSlider.doubleValue = value
windowSlider.doubleValue = value
windowTextField.doubleValue = value
}
}
就是這樣。您可以將數字格式化程序添加到文本字段中,以便它可以很好地顯示值,您可以在Interface Builder中或通過編程方式執行該值。而在其他任何時間更改值時,所有控件都將更新,因爲它們在觀察者中更新,而不僅僅是滑塊操作方法。
方法2:當涉及到模型數據連接到您的看法綁定
Bindings可以消除大量的這種鍋爐板代碼。
綁定的,你可以擺脫出口和行動方法,並有左視圖控制器的唯一的事情是:
class ViewController: NSViewController {
@objc dynamic var value: Double
}
的@objc dynamic
makes the property be KVO compliant,這是使用綁定時需要。
另一塊是從控件建立綁定到我們的ViewController的value
屬性。對於這一切是通過綁定檢查窗格中所做的控件,綁定控件視圖控制器的value
關鍵路徑的「值」:
就是這樣。再次,您可以將數字格式化程序添加到文本字段中,並且對屬性的任何其他更改仍會更新您的控件,因爲它會觸發對其的綁定。 (你仍然可以使用didSet
觀察者作爲value
進行其他更改,這是你無法使用綁定進行的更改)
啊我認爲您在方法1中的含義是手動將其連接起來。這很好,就像我已經爲Window控件所做的那樣。問題是我的TouchBar控件有自己的WindowController,我無法通過Control +拖動在主窗口ViewController上獲取對它們的@IBOutlet弱引用。那有意義嗎? – Dave
所以我認爲我真正需要的是一種定義WindowController和ViewController都可以綁定的模型的方法? – Dave
是的,通常WindowController將擁有該根模型(例如一個NSDocument),然後可以將整個模型或片段推送到它的ViewController,這可以反過來推動更新。然後在每個控制器中,它可以將其自己的模型概念綁定到它控制的任何控件。 – Taylor