2013-02-08 7 views
8

私は2つのウィンドウを持っています:ウィンドウAはNIBからロードされています。ウィンドウBはプログラムによって作成されます。bind:toObject:withKeyPath:options:一方向バインディングですか?

両方のウィンドウはNStextView有する:ウィンドウA内のTextViewのAttributedStringのIB使用モデルのプロパティtextに結合されます。ウィンドウBのテキストビューのattributedStringは、-[NSObject bind:toObject:withKeyPath:options:]メソッドを使用してモデルのtextプロパティにバインドされています。

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

はここで奇妙なことである:ウィンドウB内のTextViewは確かobj.textにバインドされていますが、TextViewの変化をobj.textに更新されることはありません。しかし、ウィンドウAのテキストビューに変更を加えた場合は、obj.textとウィンドウBのテキストビューがそれに応じて更新されます。

私は考えている、-[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 –

+0

私は上記のリンクされた質問の妥当性についてはわかりません。ここで言及するバインディングは、2つのNSControlオブジェクトの間にあります。カスタムバインディングの実装は必要ありません。 – stevesliva

2

はい、バインド:toObject:withKeyPath:オプション:が一つの方法であるとnoオプションは、この影響を与えることはできません。これは、.nibファイルでバインドするのと同じではありません。いつものように、Appleはそのような簡単なことをそのドキュメントに言及するのを忘れていました。ここで最も簡単な解決策は、フォワードを作成すると同時に逆バインドを作成することです。 値を割り当てたときにコードをデッドループさせることはありません。 ここに、ユーザーのデフォルトの例があります:

// 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

キーNSValueTransformerBindingOptionに対して、ある値を別の値に変換する必要がある場合は、2つのNSValueTransformerを使用する必要がありますか? – rraallvv

+0

これらのバインディングは互いに接続されていないので、バインディングごとに1つずつ、2つのNSValueTransformerが必要です。しかし、私はNSValueTransformerBindingOptionを使用していないし、確かに言うことができません。 –

+0

私は、例えば度からラジアンへ、そしてその逆から、2つが必要であると思います。ありがとう – rraallvv

関連する問題