动态更新NSTextField中的数字



我在制作动态单元转换器时遇到问题。我有两个文本字段:一个用于"英寸",另一个用于表示"英尺"。我的目标是在输入数字时将英寸转换为英尺,反之亦然。我希望动作是动态发生的,而不是当按下"Enter"或"Tab"按钮时。

我正在使用带有数字格式化程序的NSTextField。因此,我需要格式化程序在进行计算时也能工作。我尝试过-(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

您可以使用NSValueTransformer s绑定值。

NSValueTransformer提供了对象到对象的转换,您也可以在XIB和绑定中使用这些转换。系统定义了一些,您可以很容易地定义自己的。Apple的TemperatureConverter示例将是介绍NSValueTransformer的一个很好的起点。

响应样本的更新

+ [ApplicationDelegate initialize]中,您将看到该程序注册了所需的所有转换器。它们注册到一个名称,例如@"centrigradeFromKelvin"

一旦您需要的变压器被注册,您就可以在NIB中使用变压器。在温度转换器示例中,您可以:

  1. 导航到表单单元格
  2. 选择"表格单元格-摄氏度"
  3. 按cmd+opt+7查看字段绑定
  4. 该值绑定到SharedDefaults中的一个值-值转换器设置为"centeradeFromKelvin"

最新更新