你会希望你的视图控制器有一些明确的模型/状态这些滑块的值有什么。例如
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