繁体   English   中英

将CIVector的组件与NSSlider绑定

[英]Bind a CIVector's component with NSSlider

我正在尝试将CIVector的组件与多个NSSlider绑定,每个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的编码不兼容。

解决该问题的最干净方法是什么?

提前致谢!

CIVector是不可变的。 创建它后,您将无法更改其组件。 当滑块的值更改时,绑定试图这样做。 您显然希望发生的事情是将过滤器的inputTargetNeutral属性设置为具有更改的X分量的新CIVector 这并不简单。

我以为您可以实现一个可逆的NSValueTransformer来获取CIVector并为其提供X分量。 但是,反向操作需要从某个位置获取Y分量,并且它无权访问原始CIVector

因此,您可能需要过滤器的包装器类。 它具有属性inputTargetNeutralX 吸气剂将返回包装的过滤器的inputTargetNeutral.X 设置器将读取其inputTargetNeutral.Y ,并将其与传入的新X值结合以创建新的CIVector ,并设置过滤器的inputTargetNeutral 为了符合KVO,您可以实现+keyPathsForValuesAffectingInputTargetNeutralX以返回包含@"filter.inputTargetNeutral"NSSet (假定包装过滤器位于名为“ filter”的属性中)。 请参阅+keyPathsForValuesAffectingValueForKey:的文档。

您将对Y分量执行相同的操作。

您实际上可以使用CIFilter上的类别而不是包装器类来执行此操作。 当然,这会将这些属性添加到应用程序中的每个CIFilter上,而不仅仅是CITemperatureAndTint 在我之前的描述中,您将使用self而不是“包装过滤器”,而只需保留“过滤器”即可。 +keyPathsForValuesAffectingInputTargetNeutralX结果之外,使其隐式基于self

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM