2013-02-08 76 views
8

我有兩個窗口:窗口A從NIB加載;並且窗口B以編程方式創建。bind:toObject:withKeyPath:options:是單向綁定嗎?

這兩個窗口都有一個NStextView:窗口A中textview的屬性字符串綁定到使用IB的模型的屬性text;而使用-[NSObject bind:toObject:withKeyPath:options:]方法將Window B中textview的屬性字符串綁定到text屬性。

[textview bind:@"attributedString" toObject:obj withKeyPath:@"text" options:nil]; 

這裏是奇怪的事情:在窗口B中的TextView的確被綁定到obj.text,但在TextView的變化永遠不會更新到obj.text。但是,如果我在窗口A的文本視圖中進行更改,則窗口B中的obj.text和textview會相應更新。

所以我在想,-[NSObject bind:toObject:withKeyPath:options:]方法只適用於單向綁定。我在Cocoa文件中找不到明確的解釋。有沒有人有這個問題的經驗?你如何在代碼中實現雙向綁定?

回答

3

可可綁定本質上是雙向的,但某些行爲(如連續/實時更新文本字段)需要設置特定的選項。在IB中,您需要確保選中「連續更新值」複選框。要以編程方式獲得等效行爲,您需要在綁定上指定options。這可能是這個樣子:

[textview bind: NSAttributedStringBinding 
     toObject: obj 
    withKeyPath: @"text" 
     options: (@{ 
       NSContinuouslyUpdatesValueBindingOption : @YES })]; 

值得一提的是,建立在一個編程結合,這是值得檢查等同於IB結合,並確保你通過所有相同的設置到程序綁定。例如,我在IB中看到,對於NSTextView的歸因字符串綁定,默認情況下會選中「允許編輯多個值選擇」,「有條件地設置可編輯」和「爲不適用的鍵引發」選項。這將意味着我們的計劃結合或許應該真的樣子:

[textview bind: NSAttributedStringBinding 
     toObject: obj 
    withKeyPath: @"text" 
     options: (@{ 
       NSContinuouslyUpdatesValueBindingOption : @YES, 
       NSAllowsEditingMultipleValuesSelectionBindingOption : @YES, 
       NSConditionallySetsEditableBindingOption : @YES, 
       NSRaisesForNotApplicableKeysBindingOption : @YES })]; 
+0

這仍然不適用於我。我在這裏找到了答案(對於我的案例) - > http://stackoverflow.com/questions/1169097/can-you-manually-implement-cocoa-bindings – 2013-06-24 21:43:34

+0

我不確定上述鏈接問題的相關性。這裏提到的綁定是在兩個NSControl對象之間 - 不需要自定義綁定實現。 – stevesliva 2014-03-27 20:26:32

2

是,綁定:toObject:withKeyPath:選擇:是單向的,沒有選項可以影響這一點。這與您在.nib文件中進行綁定的方式不同。像往常一樣,蘋果忘記在文檔中提到這樣簡單的事情。這裏最簡單的解決方案是在創建轉發綁定的同時創建反向綁定。 當您分配值時,這不會死循環您的代碼。 下面是用戶默認設置的示例:

// two way binding of MyObject.myValue to user defaults 
[NSUserDefaultsController.sharedUserDefaultsController.values bind: @"myValueInDefaults" 
                  toObject: myObject 
                 withKeyPath: @"myValue" 
                  options: @{@"NSContinuouslyUpdatesValue":@YES}]; 

[myObject bind: @"myValue" 
     toObject: NSUserDefaultsController.sharedUserDefaultsController 
    withKeyPath: @"values.myValueInDefaults" 
     options: @{@"NSContinuouslyUpdatesValue":@YES}]; 
+0

是否需要使用兩個NSValueTransformers,如果我需要將一個值轉換爲另一個值,反之亦然,對於NSValueTransformerBindingOption關鍵字,還是隻需要一個? – rraallvv 2015-03-29 06:46:53

+0

因爲這些綁定沒有相互連接,我認爲你需要兩個NSValueTransformers,每個綁定一個。但我沒有使用NSValueTransformerBindingOption並且無法確定。 – 2015-03-30 12:58:03

+0

我看到,例如從度數到弧度,反之亦然,我認爲將需要其中兩個,謝謝 – rraallvv 2015-03-30 13:03:20