2017-08-02 39 views
0

我是Swift/macOS开发新手,除此之外还有很多开发经验。只是想让事情变得简单。Swift:如何将Touch Bar控件连接到主窗口控件

这里是我的应用程序的故事板:

enter image description here

我试图让:

  • 触摸条滑块在主窗口上的滑块改变
  • 反之亦然改变
  • 使用滑块的Int值更新触摸条标签按钮。

Q)我该如何做到这一点?

注意:当我操作主窗口滑块控件时,主窗口滑块控件已连线并工作。

@IBOutlet weak var mySlider: NSSlider! 

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

回答

1

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

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 dynamicmakes the property be KVO compliant,这是使用绑定时需要。

另一块是从控件建立绑定到我们的ViewController的value属性。对于这一切是通过绑定检查窗格中所做的控件,绑定控件视图控制器的value关键路径的“值”:

Bindings Inspector

就是这样。再次,您可以将数字格式化程序添加到文本字段中,并且对属性的任何其他更改仍会更新您的控件,因为它会触发对其的绑定。 (你仍然可以使用didSet观察者作为value进行其他更改,这是你无法使用绑定进行的更改)

+0

啊我认为您在方法1中的含义是手动将其连接起来。这很好,就像我已经为Window控件所做的那样。问题是我的TouchBar控件有自己的WindowController,我无法通过Control +拖动在主窗口ViewController上获取对它们的@IBOutlet弱引用。那有意义吗? – Dave

+0

所以我认为我真正需要的是一种定义WindowController和ViewController都可以绑定的模型的方法? – Dave

+0

是的,通常WindowController将拥有该根模型(例如一个NSDocument),然后可以将整个模型或片段推送到它的ViewController,这可以反过来推动更新。然后在每个控制器中,它可以将其自己的模型概念绑定到它控制的任何控件。 – Taylor

相关问题