我试图用几个NSSlider绑定一个CIVector的组件,每个组件都绑定到CIVector的一个不同的组件。
更具体地说,我试图使用以下代码将CITemperatureAndTint.inputTarget中性.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的键值编码。
最干净的方法是什么?
提前感谢!
发布于 2012-04-13 01:35:56
CIVector是不可变的。您不能在创建它的组件之后更改它的组件。当滑块的值发生变化时,绑定将尝试这样做。显然,您想要实现的是将过滤器的inputTargetNeutral属性设置为一个新的CIVector,并使用更改后的X组件。这可不简单。
我在想,您可能会实现一个可逆的NSValueTransformer,以获取一个CIVector并给出它的X组件。但是,反向操作需要从某个地方获取Y组件,并且它无法访问原始的CIVector。
因此,您可能需要一个过滤器的包装类。它将有一个属性inputTargetNeutralX。getter将返回包装过滤器的inputTargetNeutral.X。设置器将读取其inputTargetNeutral.Y,将其与传入的新X值相结合以创建新的CIVector,并设置过滤器的inputTargetNeutral。为了符合KVO要求,您可以实现+keyPathsForValuesAffectingInputTargetNeutralX来返回包含@"filter.inputTargetNeutral"的NSSet (假设包装器过滤器保存在一个名为“@"filter.inputTargetNeutral"”的属性中)。请参阅+keyPathsForValuesAffectingValueForKey:的文档。
你对Y组件也会这么做。
实际上,您可以在CIFilter上使用一个类别来实现这一点,而不是使用包装器类。当然,这会将这些属性添加到应用程序中的每个CIFilter中,而不仅仅是CITemperatureAndTint。在我前面的描述中,您将使用self而不是“包装器过滤器”,只需保留“filter”。从+keyPathsForValuesAffectingInputTargetNeutralX结果中得到隐式的self-based。
编辑:我忘了指出显而易见的一点:在您创建了这些新的inputTargetNeutralX和inputTargetNeutralY属性之后,这就是您要绑定的内容。
https://stackoverflow.com/questions/10123244
复制相似问题