2017-08-02 40 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

相關問題