2012-04-14 10 views
1

は、私は(NSViewのサブクラス - 実際のを修正エディタではなくNSTextViewのサブクラスとしましょう)カスタムクラスを持って、私は次のように、(私はほとんど間違いなく、Interface Builderを介して、それを行うことはできません)プログラムでNSArrayControllerに結合していますこの:値が変更されたときにCocoaバインディングはプログラムで+値を更新しない?

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

上記の作品は、しかし、それは私のNSArrayControllerに更新されていない - それは、「固執」しないかのようです。

私も下のoptionsを使用して、しようとしたが、無駄にしました:

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

任意のアイデア?

+0

カスタムビューでどのように実装しましたか? – ughoavgfhw

+0

@ughoavgfhw Scintillaコンポーネント(Cocoa用)のビューですので、カスタムメイドではありません。これはScintillaの公式リリースに含まれています。 –

答えて

6

クラスはバインディングのサポートを実装する必要があります。 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"]が実行されます。

しかし、NSObjectmyEditorの "文字列"プロパティを観察しようとすることも、[myController setValue:<...> forKeyPath:@"selection.content"]を呼び出すこともありません。

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

+0

お返事ありがとうございました! :-) –

関連する問題