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是不可变的。创建后您无法更改其组件。当滑块的值发生变化时,绑定会尝试这样做。您显然希望发生的事情是inputTargetNeutral将过滤器的属性设置为CIVector具有更改的 X 组件的新属性。这并不简单。

我在想你可能会实现一个可逆NSValueTransformer的取 aCIVector并给出它的 X 组件。但是,反向操作需要从某个地方获取一个 Y 组件,并且它无法访问原始的CIVector.

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

你会为 Y 组件做同样的事情。

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

编辑:我忘了指出显而易见的:在你创建了这些新的inputTargetNeutralXinputTargetNeutralY属性之后,这就是你要绑定的。

于 2012-04-13T01:35:56.983 回答