- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用绑定(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 int
与 NSUInteger
相同。这些天您可能还应该使用 double
和 -[NSNumber doubleValue]
而不是 float
/-floatValue
如果您关心精度。
我看到的另一个令人困惑的问题是,您向数字对象询问浮点值,执行算术,然后将结果转换为整数以使用结果创建新数字,反之亦然。为什么不直接要求目标原始类型呢?当您可以直接请求 -floatValue
时,为什么要请求它的整数值,然后将其转换为 float
进行浮点运算?示例:
return [NSNumber numberWithFloat:([value floatValue] / 100.0)];
...反之亦然:
return [NSNumber numberWithInteger:([value floatValue] * 100.0)];
由于 NSNumber
将为您进行转换(您可以输入任何类型的数字并取出任何类型的数字,无需担心),因此不需要所有这些额外的东西。
但这让我了解了您的总体方法。据我了解,您希望 slider 和文本字段影响相同的值,但文本字段应显示该值乘以 100,可能格式为整数。如果我误解了您的目标(您没有真正描述 - 您只是针对更广泛的问题提出了一个非常狭隘的问题),请告诉我,我会修改我的答案。
如果这是您想要实现的目标,那么我有几点:
值转换器对于它们要转换的值和它们所绑定(bind)的属性来说是双向的。也就是说,它们获取一些值并对其进行转换(如果愿意,可以“翻译”)一种显示方式和内部存储/设置的相反方式。在您的情况下,您只希望将内部存储的值乘以 100 进行显示,但用户输入的任何值(以该大小)都应该转换回来(除以 100)以进行存储(如果发生更改)。由于 slider 直接反射(reflect)实际存储的值,因此不需要值转换器。
此处的值绑定(bind)涉及 NSNumber
实例,正如我上面所说,这些实例在内部与类型无关。这意味着“数字就是数字”。您可以存储和检索您喜欢的任何原始类型。没有理由投。我在上面说过这一点,但值得重复。
如果您想使用值的内部存储来处理 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/
我是一名优秀的程序员,十分优秀!