gpt4 book ai didi

Swift:如何将 Touch Bar 控件链接到主窗口控件

转载 作者:行者123 更新时间:2023-11-28 12:19:00 27 4
gpt4 key购买 nike

我是 Swift/macOS 开发的新手,但在其他方面有很多开发经验。只是想做一些基本的东西。

这是我的应用 Storyboard:

enter image description here

我想得到:

  • 当主窗口上的 slider 发生变化时,Touch Bar slider 也会随之变化
  • 反之亦然
  • 使用 slider 的 Int 值更新 Touch Bar Label 按钮。

问)我该如何实现?

注意:例如,当我操作主窗口 slider 控件时,它已连接并正常工作

@IBOutlet weak var mySlider: NSSlider!

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

最佳答案

您会希望您的 View Controller 具有这些 slider 所具有的值的明确模型/状态。例如

class ViewController : NSViewController {
var value: Double
}

然后您可以连接 slider 和文本字段来更新或显示该值。

方法 1:目标/操作/设置值

这是在使用您已启动的显式 IBAction 之后。作为对该 Action 的响应,我们将从 slider 中提取 doubleValue 并从中更新 ViewController 的模型:

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

第二部分是更新所有内容以反射(reflect)新值。使用 Swift,我们可以在 ViewController 的值属性上使用 didSet 观察器来了解它何时更改并更新所有控件,例如:

@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 观察器中更新的,而不仅仅是 slider 操作方法。

方法 2:绑定(bind)

Bindings在将模型数据连接到您的 View 时,可以消除很多样板代码。

通过绑定(bind),您可以摆脱 outlet 和 action 方法, View Controller 中只剩下:

class ViewController: NSViewController {
@objc dynamic var value: Double
}

@objc 动态 makes the property be KVO compliant ,这是使用绑定(bind)时所必需的。

另一部分是建立从控件到 ViewController 的 value 属性的绑定(bind)。对于所有控件,这是通过绑定(bind)检查器 Pane 完成的,将控件的“值”绑定(bind)到 View Controller 的 value 键路径:

Bindings Inspector

就是这样。同样,您可以向文本字段添加一个数字格式化程序,并且对 value 属性的任何其他更改仍会更新您的控件,因为它会触发对其的绑定(bind)。 (您仍然可以使用 didSet 观察器来获取 value 以进行其他无法使用绑定(bind)进行的更改)

关于Swift:如何将 Touch Bar 控件链接到主窗口控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45465585/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com