使用NSSlider绑定CIVector的组件

时间:2012-04-12 12:07:14

标签: objective-c cocoa-bindings core-image

我正在尝试将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的密钥值编码兼容。

解决这个问题的最简洁方法是什么?

提前致谢!

1 个答案:

答案 0 :(得分:1)

CIVector是不可变的。创建后,您无法更改其组件。当滑块的值发生变化时,绑定正在尝试这样做。您显然希望发生的是将过滤器的inputTargetNeutral属性设置为具有已更改的X组件的新CIVector。这不是直截了当的。

我原以为你可以实现一个可逆的NSValueTransformer来获取CIVector并给它的X组件。但是,反向操作需要从某处获取Y组件,并且无法访问原始CIVector

因此,您可能需要一个过滤器的包装类。它将具有属性inputTargetNeutralX。 getter将返回包装过滤器的inputTargetNeutral.X。 setter会读取其inputTargetNeutral.Y,将其与传入的新X值组合以创建新的CIVector,并设置过滤器的inputTargetNeutral。为了实现KVO合规性,您需要实现+keyPathsForValuesAffectingInputTargetNeutralX以返回包含NSSet的{​​{1}}(假设包装过滤器保存在名为“filter”的属性中)。请参阅+keyPathsForValuesAffectingValueForKey:的文档。

您对Y组件也这样做。

您实际上可以使用@"filter.inputTargetNeutral"上的类别而不是包装类来执行此操作。当然,这会将这些属性添加到应用中的每个CIFilter,而不仅仅是CIFilter。您在我之前的描述中使用CITemperatureAndTint而不是“包装器过滤器”,只需保留“过滤器”。超出self结果,以隐含+keyPathsForValuesAffectingInputTargetNeutralX为基础。

编辑:我忘了指出显而易见的事项:在您创建了这些新的selfinputTargetNeutralX属性之后,这就是您要绑定的内容。