我在制作动态单位转换器时遇到麻烦。我有两个文本字段:一个用于“英寸”,另一个用于“英尺”。我的目标是在输入数字时将英寸转换为英尺,反之亦然。我希望动作是动态发生的,而不是在按下“ 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

最佳答案

您可以使用NSValueTransformer绑定值。

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

更新以回应样品

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

一旦注册了所需的笔录,即可在NIB中使用变压器。在TemperatureConvertoer示例中,您可以:


导航到表格单元格
选择晶格-摄氏度
按cmd + opt + 7查看字段绑定
该值绑定到SharedDefaults中的值-值转换器设置为“ centrigradeFromKelvin”。

10-06 13:23