9

2 つのウィンドウがあります。ウィンドウ A は NIB からロードされます。ウィンドウ B はプログラムで作成されます。

どちらのウィンドウにも NStextView があります。ウィンドウ A の textview の attributedString は、IB を使用しtextてモデルのプロパティにバインドされています。ウィンドウ B の textview の attributedString は、メソッドを使用してモデルのプロパティにバインドされます。text-[NSObject bind:toObject:withKeyPath:options:]

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

奇妙なことに、ウィンドウ B のテキストビューは実際には にバインドされてobj.textいますが、テキストビューの変更が に更新されることはありませんobj.text。しかし、ウィンドウ A のテキストビューを変更するobj.textと、それに応じてウィンドウ B のテキストビューも更新されます。

だから私は考えています、-[NSObject bind:toObject:withKeyPath:options:]メソッドは一方向バインディングのみです。Cocoa のドキュメントに明確な説明が見つかりませんでした。この問題の経験はありますか?コードで双方向バインディングをどのように実装しますか?

4

2 に答える 2

5

Cocoa バインディングは本質的に双方向ですが、特定の動作 (テキスト フィールドの継続的/ライブ更新など) では、特定のオプションを設定する必要があります。IB では、[Continuously Updates Value] チェック ボックスがオンになっていることを確認する必要があります。optionsプログラムで同等の動作を得るには、バインディングで指定する必要があります。それは次のようになります。

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

プログラムでバインディングを設定する場合、IB で同等のバインディングをチェックし、すべて同じ設定をプログラム バインディングに渡していることを確認する価値があることに注意してください。たとえば、NSTextView の属性付き文字列バインディングでは、「複数の値の選択を編集できるようにする」、「条件付きで編集可能に設定する」、および「該当しないキーを発生させる」オプションがすべてデフォルトでチェックされていることを IB で確認できます。つまり、プログラムによるバインドはおそらくのようになります。

[textview bind: NSAttributedStringBinding 
      toObject: obj 
   withKeyPath: @"text" 
       options: (@{ 
                 NSContinuouslyUpdatesValueBindingOption : @YES,
                 NSAllowsEditingMultipleValuesSelectionBindingOption : @YES,
                 NSConditionallySetsEditableBindingOption : @YES,
                 NSRaisesForNotApplicableKeysBindingOption : @YES })];
于 2013-02-14T02:20:04.960 に答える