0

我是 Swift/macOS 开发的新手,但在其他方面拥有丰富的开发经验。只是试图使一些基本的东西。

这是我的应用故事板:

在此处输入图像描述

我试图得到:

  • 当主窗口上的滑块更改时,Touch Bar 滑块会更改
  • 反之亦然
  • 使用滑块的 Int 值更新 Touch Bar Label 按钮。

问)我如何实现这一目标?

注意:当我操纵它时,主窗口滑块控件已连接并工作,例如

@IBOutlet weak var mySlider: NSSlider!

@IBAction func mySlider_Changed(_ sender: NSSlider) {
    //... stuff happens here.
}
4

1 回答 1

2

你会希望你的视图控制器有一些明确的模型/状态,这些滑块的值是什么。例如

class ViewController : NSViewController {
    var value: Double
}

然后您可以连接滑块和文本字段以更新或显示此值。

方法一:目标/行动/设定值

这是在使用您已启动的显式 IBAction 之后进行的。作为对该动作的响应,我们将从滑块中拉出 doubleValue 并从中更新 ViewController 的模型:

@IBAction func sliderValueChanged(_ sender: NSSlider) {
    value = sender.doubleValue
}

第二部分是更新所有内容以反映新价值。使用 Swift,我们可以只使用didSetViewController 的 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来进行绑定无法进行的其他更改)

于 2017-08-02T21:28:10.443 回答