0

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

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

 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 のキー値コーディングに準拠していません。

それを修正する最もクリーンな方法は何ですか?

前もって感謝します!

4

1 に答える 1

1

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

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

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

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

実際にCIFilterは、ラッパー クラスの代わりにカテゴリをオンにしてこれを行うことができます。もちろん、これらのプロパティはsCIFilterだけでなく、アプリ内のすべてに追加されますCITemperatureAndTintself前の説明の「ラッパー フィルター」の代わりに使用し、単に「フィルター」のままにします。結果から+keyPathsForValuesAffectingInputTargetNeutralXそれを暗黙的にselfベースにする。

編集: 明らかなことを指摘するのを忘れていました: これらの新しいinputTargetNeutralXおよびinputTargetNeutralYプロパティを作成した後、それがバインド先になります。

于 2012-04-13T01:35:56.983 に答える