5

モデルにバインドされた NSTextField があります。テキスト フィールドの内容をプログラムで変更しても、モデルは更新されません。代わりにモデルを更新することになっていることは知っています。

しかし、マウスをスクロールして数値を変更しているときにスクロールを認識する NSTextField サブクラスを実装しようとしています。明らかに、このサブクラスからモデルにアクセスすることはできません。それで、私がこれを行う方法について何か提案はありますか?

解決策(ノアに感謝):

- (void)scrollWheel:(NSEvent *)theEvent {
    [self setFloatValue:[self floatValue] - [theEvent deltaY]];
    NSDictionary *bindingInfo = [self infoForBinding: NSValueBinding];
    NSObject *boundObject = [bindingInfo valueForKey:NSObservedObjectKey];
    NSString *keyPath = [bindingInfo valueForKey:NSObservedKeyPathKey];
    [boundObject setValue:[NSNumber numberWithFloat:[self floatValue]]
               forKeyPath:keyPath];
}
4

1 に答える 1

6

target-action または Cocoa Bindings のいずれかを使用できます。

  1. ターゲット - アクション: テキスト フィールドのアクション セレクターをコントローラーの updateValue アクションに接続します。次に、テキスト フィールドで、テキスト フィールドの値を変更した後にセレクターを呼び出します。アクションは、テキスト フィールドの値を取得し、それをモデルに伝達する必要があります。

  2. Cocoa バインディング: テキスト フィールドの値バインディングをモデル オブジェクトの KVO 準拠のプロパティに設定します。次に、セルの値を更新すると、バインダーがモデル オブジェクトを更新します。

これらの特定の設計の利点は、テキスト フィールドとモデル プロパティの間の結合がバインディングまたはターゲットのいずれかで処理されることです。別のプロパティにテキスト フィールドを使用する場合は、カスタム テキスト フィールド コードを変更せずに、別のアクションまたは別のバインディングを使用できます。

私自身、おそらくバインディングを使用する方が少ないと思いますが、target-action もまったく問題なく、もう少し簡単です。


確かに、あなたは「縛られた」と言いました。テキストフィールドへのプログラムによる変更が更新をトリガーしたと思いましたが、そうではないため、バインドされた値を自分で更新できます。試すことができるコードは次のとおりです。

NSDictionary *bindingInfo = [self infoForBinding:NSValueBinding];
[[bindingInfo valueForKey:NSObservedObjectKey] setValue:self.integerValue
                                             forKeyPath:[bindingInfo valueForKey:NSObservedKeyPathKey]];
于 2012-05-15T17:07:03.073 に答える