我无法制作动态单位转换器。我有两个文本字段:一个用于“英寸”,另一个用于“英尺”。我的目标是在输入数字时将英寸转换为英尺,反之亦然。我希望动作动态发生,而不是按下“Enter”或“Tab”按钮时。
我正在使用NSTextField和Number Formatter。所以我需要格式化程序在计算发生时也能工作。我已经尝试了 - (void)controlTextDidChange方法,但格式化程序无法使用它。
请参阅下面的我当前的代码,它不能动态运行。
#import <Foundation/Foundation.h>
@interface Convert : NSObject {
IBOutlet NSTextField *inches;
IBOutlet NSTextField *feet;
}
- (IBAction)textDidChange:(id)sender;
@end
和
#import "Convert.h"
@implementation Convert
- (IBAction)textDidChange:(id)sender {
if (sender == inches) {
float myInches = [inches floatValue];
[feet setFloatValue: (myInches/12)];
}
else if (sender == feet) {
float myFeet = [feet floatValue];
[inches setFloatValue: (myFeet*12)];
}
}
@end
有人能告诉我如何在不按“Enter”或“Tab”键的情况下完成此操作吗?
...现在尝试使用NSForm而不是NSTextField的NSValueTransformer方法......
#import <Foundation/Foundation.h>
@interface LengthConverter : NSValueTransformer
+ (Class)transformedValueClass;
+ (BOOL)allowsReverseTransformation;
- (id)transformedValue:(id)value;
- (id)reverseTransformedValue:(id)value;
@end
和
#import "LengthConverter.h"
@implementation LengthConverter
+ (Class)transformedValueClass {
return [NSNumber class];
}
+ (BOOL)allowsReverseTransformation {
return YES;
}
- (id)transformedValue:(id)value {
if (value == nil) return nil;
if (![value respondsToSelector: @selector(doubleValue)]) {
[NSException raise:NSInternalInconsistencyException format:@"Value does not respond",[value class]];
}
CGFloat inchesInputValue = [value doubleValue]; // handles NSString and NSNumber
CGFloat feetOutputValue = inchesInputValue / 12;
return [NSNumber numberWithDouble: feetOutputValue];
}
- (id)reverseTransformedValue:(id)value {
if (value == nil) return nil;
if (![value respondsToSelector: @selector(doubleValue)]) {
[NSException raise:NSInternalInconsistencyException format:@"Value does not respond",[value class]];
}
CGFloat feetInputValue = [value doubleValue]; // handles NSString and NSNumber
CGFloat inchesOutputValue = feetInputValue * 12;
return [NSNumber numberWithDouble: inchesOutputValue];
}
@end
答案 0 :(得分:2)
您可以使用NSValueTransformer
s绑定值。
NSValueTransformer
提供对象转换,您也可以在XIB和绑定中使用它。系统定义了一些,您可以很容易地定义自己的。 Apple的TemperatureConverter示例将是引入NSValueTransformer
的良好起点。
更新以回应示例
在+ [ApplicationDelegate initialize]
中,您将看到程序注册所需的所有变换器。他们注册了一个名称,例如@"centrigradeFromKelvin"
。
一旦您需要的trafos被注册,您就可以在NIB中使用变压器。在TemperatureConvertoer示例中,您可以: