我正在尝试将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的密钥值编码兼容。
解决这个问题的最简洁方法是什么?
提前致谢!
答案 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
为基础。
编辑:我忘了指出显而易见的事项:在您创建了这些新的self
和inputTargetNeutralX
属性之后,这就是您要绑定的内容。