gpt4 book ai didi

objective-c - 使用带有绑定(bind)和reverseTransformedValue方法的自定义NSValueTransformer子类

转载 作者:行者123 更新时间:2023-12-03 17:02:11 26 4
gpt4 key购买 nike

我正在使用绑定(bind)编写一个 Cocoa 应用程序。我有一个 NSSlider 和一个 NSTextField。

slider 的值绑定(bind)到transformedValue方法返回的值,而TextBox应该绑定(bind)到reverseTransformedValue方法。

我怎样才能实现这个目标?对于 slider ,我将 NSValueTransformer 子类的名称输入到“绑定(bind)”选项卡的“值/值转换器”部分。但是我如何告诉 TextFields Value Transformer 部分使用该类的verseTransformedValue?

我的类实现如下所示: @实现IntegerBy1002FloatTransformer

-(BOOL)allowsReverseTransformation{
return YES;
}

-(id)transformedValue:(id)value{
float floatValue;
int integerValue;

/* sanity checks omitted */
integerValue=(int)[value integerValue];
floatValue=(float)integerValue/100.0;
return [NSNumber numberWithFloat: floatValue];
}

-(id)reverseTransformedValue:(id)value{
float floatValue;
int integerValue;

/* sanity checks omitted */
floatValue=[value floatValue];
integerValue=(int)(floatValue*100.0);
return [NSNumber numberWithInt: integerValue];
}
@end

最佳答案

考虑到您提到的目标和一般情况,您的代码有一些值得关注的事项。关于您的总体方法,您需要重新考虑一些事情。

我看到的一个问题(与您的实际问题无关)是 -[NSNumber integerValue] 返回一个 NSInteger,而不是 int.事实上,只要您需要 int,就可以使用 NSInteger,因为系统在编译时针对 32/64 位和其他平台问题“做了正确的事情”。 unsigned intNSUInteger 相同。这些天您可能还应该使用 double-[NSNumber doubleValue] 而不是 float/-floatValue如果您关心精度。

我看到的另一个令人困惑的问题是,您向数字对象询问浮点值,执行算术,然后将结果转换为整数以使用结果创建新数字,反之亦然。为什么不直接要求目标原始类型呢?当您可以直接请求 -floatValue 时,为什么要请求它的整数值,然后将其转换为 float 进行浮点运算?示例:

return [NSNumber numberWithFloat:([value floatValue] / 100.0)];

...反之亦然:

return [NSNumber numberWithInteger:([value floatValue] * 100.0)];

由于 NSNumber 将为您进行转换(您可以输入任何类型的数字并取出任何类型的数字,无需担心),因此不需要所有这些额外的东西。

但这让我了解了您的总体方法。据我了解,您希望 slider 和文本字段影响相同的值,但文本字段应显示该值乘以 100,可能格式为整数。如果我误解了您的目标(您没有真正描述 - 您只是针对更广泛的问题提出了一个非常狭隘的问题),请告诉我,我会修改我的答案。

如果这是您想要实现的目标,那么我有几点:

  1. 值转换器对于它们要转换的值和它们所绑定(bind)的属性来说是双向的。也就是说,它们获取一些值并对其进行转换(如果愿意,可以“翻译”)一种显示方式和内部存储/设置的相反方式。在您的情况下,您只希望将内部存储的值乘以 100 进行显示,但用户输入的任何值(以该大小)都应该转换回来(除以 100)以进行存储(如果发生更改)。由于 slider 直接反射(reflect)实际存储的值,因此不需要值转换器。

  2. 此处的值绑定(bind)涉及 NSNumber 实例,正如我上面所说,这些实例在内部与类型无关。这意味着“数字就是数字”。您可以存储和检索您喜欢的任何原始类型。没有理由投。我在上面说过这一点,但值得重复。

  3. 如果您想使用值的内部存储来处理 float ,但只允许在文本字段的显示和输入中使用整数,请使用 NSNumberFormatter (将其附加到文本字段并将其配置为仅显示整数 - 在 Interface Builder 中轻松完成)。由于上面的数字 2(即,它是一个 NSNumber),因此根本无需担心从值中获取的原始类型。控件(带有数字格式化程序)会为您处理这些事情。顺便说一句,它还在编辑过程中对用户输入强制执行此操作。

考虑到上述内容,您的值转换器方法可以大大简化(特别是使用 ObjC 2.0 的优点,例如自动数字装箱和点符号):

- (id)transformedValue:(id)value {
/* sanity checks omitted */
return @( value.doubleValue / 100.0 );
}

- (id)reverseTransformedValue:(id)value {
/* sanity checks omitted */
return @( value.doubleValue * 100.0 )
}

我希望这会有所帮助。

关于objective-c - 使用带有绑定(bind)和reverseTransformedValue方法的自定义NSValueTransformer子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30873690/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com