2012-04-12 19 views
0

CIVectorのコンポーネントを複数のNSSliderにバインドしようとしていますが、それぞれがCIVectorの別のコンポーネントにバインドされています。CIVectorのコンポーネントをNSSliderにバインドする

は具体的には、私は次のコードを使用してNSSliderとCITemperatureAndTint.inputTargetNeutral.Xをバインドしようとしている:

NSMutableDictionary *bindingOptions = [NSMutableDictionary dictionary]; 
[bindingOptions setObject:[NSNumber numberWithBool:YES] 
       forKey:NSValidatesImmediatelyBindingOption]; 
[bindingOptions setObject:[NSNumber numberWithBool:YES] 
       forKey:NSContinuouslyUpdatesValueBindingOption]; 


[temp_slider bind: @"value" 
     toObject: filter 
    withKeyPath: @"inputTargetNeutral.X" 
     options: bindingOptions]; 

をしかし、私は、このエラーメッセージが出てい:

[setValueの:forUndefinedKey:]:このクラスはキーXに対応するキー値をコード化していません。

これを解決する最もクリーンな方法は何ですか?

ありがとうございます!

答えて

1

CIVectorは不変です。作成後、コンポーネントを変更することはできません。スライダの値が変更されたときにバインディングが行おうとしています。明らかに起こりたいのは、フィルタのinputTargetNeutralプロパティが、変更されたXコンポーネントを持つ新しいCIVectorに設定されていることです。それは簡単ではありません。

リバーシブルNSValueTransformerを実装してCIVectorとし、そのXコンポーネントを提供すると考えていました。ただし、逆の操作ではYコンポーネントをどこかから取得する必要があり、元のCIVectorにアクセスできません。

したがって、フィルタのラッパークラスが必要な場合があります。プロパティーはinputTargetNeutralXです。ゲッターはラップされたフィルターのinputTargetNeutral.Xを返します。設定者はinputTargetNeutral.Yを読み取り、渡された新しいX値と組み合わせて新しいCIVectorを作成し、フィルタのinputTargetNeutralを設定します。 KVOに準拠させるには+keyPathsForValuesAffectingInputTargetNeutralXを実装して、を含むNSSetを返します(ラッパーフィルタが「filter」という名前のプロパティに保持されていると仮定します)。 +keyPathsForValuesAffectingValueForKey:のドキュメントをご覧ください。

Yコンポーネントでも同じことを行います。

実際には、ラッパークラスではなくCIFilterのカテゴリでこれを実行できます。もちろん、それはだけでなく、あなたのアプリのすべてのCIFilterにこれらのプロパティを追加します。前の説明で "ラッパーフィルタ"の代わりにselfを使用し、単に "フィルタ"を残しておきます。 +keyPathsForValuesAffectingInputTargetNeutralXの結果から暗黙のうちにselfベースになります。

編集:これらの新しいinputTargetNeutralXinputTargetNeutralYのプロパティを作成した後は、それをバインドします。

関連する問題