2

私はプログラムでバインドしているカスタムクラス(のサブクラスNSView-実際には変更されたエディターとしましょうが、のサブクラスではありません)を持っています(私は間違いなくInterface Builderを介してそれを行うことはできません)、次のように:NSTextViewNSArrayController

[myEditor bind:@"string" 
     toObject:myController 
  withKeyPath:@"selection.content" 
      options:nil];

上記は機能しますが、値が変更されても my に更新されNSArrayControllerません。まるで「固執」していないかのようです。

以下を使用して試してみましoptionsたが、役に立ちませんでした:

NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys:
                         [NSNumber numberWithBool:YES],NSContinuouslyUpdatesValueBindingOption, 
                         [NSNumber numberWithBool:YES],NSAllowsEditingMultipleValuesSelectionBindingOption,
                         [NSNumber numberWithBool:YES],NSConditionallySetsEditableBindingOption,
                         [NSNumber numberWithBool:YES],NSRaisesForNotApplicableKeysBindingOption,
                         nil];

何か案は?

4

1 に答える 1

8

クラスはバインディングのサポートを実装する必要があります。Cocoa に付属するビュー クラスとセル クラスは、通常、特定のバインディング セットを実装します。カスタム サブクラスが実行するかどうかは、実装者次第です。

クラスがバインディングの特定のサポートを実装していない場合、-bind:...リクエストはNSObjectの実装に失敗します。ただし、その実装は非常に限られています。observableControllerのキー パスを監視し、バインディングと同じ名前を持つレシーバーのプロパティを KVC 経由で更新します。しかし、それは他の方向には行きません。つまり、レシーバーのプロパティへの変更は、キー パスを介して observableController に転送されません。

あなたの例を使用して、これをあまり抽象化しないようにします。のクラスがmyEditor「文字列」バインディングのサポートを具体的に実装していない場合、NSObjectの実装で実装されます[myController addObserver:<some private observer object> forKeyPath:@"selection.content" options:<...> context:<...>]

プライベート オブザーバー オブジェクトが変更通知を受け取ると、それは実行されます[myEditor setValue:[myController valueForKeyPath:@"selection.content"] forKey:@"string"]

ただし、の「文字列」プロパティNSObjectを監視しようとしたり、 を呼び出したりすることはありません。myEditor[myController setValue:<...> forKeyPath:@"selection.content"]

バインディングのサポートを実装する方法の詳細については、Apple のドキュメントを参照してください。

于 2012-04-14T16:34:05.800 に答える