你会希望你的视图控制器有一些明确的模型/状态,这些滑块的值是什么。例如
class ViewController : NSViewController {
var value: Double
}
然后您可以连接滑块和文本字段以更新或显示此值。
方法一:目标/行动/设定值
这是在使用您已启动的显式 IBAction 之后进行的。作为对该动作的响应,我们将从滑块中拉出 doubleValue 并从中更新 ViewController 的模型:
@IBAction func sliderValueChanged(_ sender: NSSlider) {
value = sender.doubleValue
}
第二部分是更新所有内容以反映新价值。使用 Swift,我们可以只使用didSet
ViewController 的 value 属性上的观察者来了解它何时更改并更新所有控件,例如:
@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 中或以编程方式执行此操作。并且任何其他时间更改值时,所有控件仍将更新,因为它们在didSet
观察者中更新,而不仅仅是滑块操作方法。
方法 2:绑定
在将模型数据连接到视图时,绑定可以消除很多这种样板代码。
使用绑定,您可以摆脱出口和操作方法,并在视图控制器中剩下的唯一内容是:
class ViewController: NSViewController {
@objc dynamic var value: Double
}
使@objc dynamic
属性与 KVO 兼容,这是使用绑定时所必需的。
另一部分是建立从控件到我们的 ViewControllervalue
属性的绑定。对于所有控件,这是通过绑定检查器窗格完成的,将控件的“值”绑定到视图控制器的value
键路径:
就是这样。同样,您可以向文本字段添加数字格式化程序,并且对属性的任何其他更改value
仍将更新您的控件,因为它会触发对其的绑定。(您仍然可以使用didSet
观察者value
来进行绑定无法进行的其他更改)