Objective c 动态更新NSTEXT字段中的数字

Objective c 动态更新NSTEXT字段中的数字,objective-c,cocoa,nstextfield,Objective C,Cocoa,Nstextfield,我在制作动态单元转换器时遇到问题。我有两个文本字段:一个用于“英寸”,另一个用于“英尺”。我的目标是在输入数字时将英寸转换为英尺,反之亦然。我希望动作是动态发生的,而不是当按下“回车”或“制表”按钮时 我正在将NSTextField与数字格式化程序一起使用。因此,我需要格式化程序在进行计算时也能工作。我尝试了-(void)controlTextDidChange方法,但格式化程序无法使用它 请参阅下文,了解我当前无法动态工作的代码 #import <Foundation/Foundatio

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

我正在将NSTextField与数字格式化程序一起使用。因此,我需要格式化程序在进行计算时也能工作。我尝试了-(void)controlTextDidChange方法,但格式化程序无法使用它

请参阅下文,了解我当前无法动态工作的代码

#import <Foundation/Foundation.h>

@interface Convert : NSObject {
    IBOutlet NSTextField *inches;
    IBOutlet NSTextField *feet;
}

- (IBAction)textDidChange:(id)sender;

@end
有人能告诉我如何在不按“回车”或“制表”键的情况下完成这项工作吗

…现在正在尝试使用NSForm而不是NSTextField的NSValueTransformer方法

#import <Foundation/Foundation.h>

@interface LengthConverter : NSValueTransformer

+ (Class)transformedValueClass;
+ (BOOL)allowsReverseTransformation;

- (id)transformedValue:(id)value;
- (id)reverseTransformedValue:(id)value;

@end

您可以使用
NSValueTransformer
s绑定值

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

根据样本更新

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

一旦您需要的trafos被注册,您就可以在NIB中使用transformer。在TemperatureConverter示例中,您可以:

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

  • 你能详细说明我如何在代码中实现NSValueTransformer吗?我以前从未使用过它们。如何在绑定中声明“模型密钥路径”?请参阅我更新的问题和代码。我现在使用的是NSForm,而不是NSTextField框,就像Apple文档中的TemperatureConverter示例一样。但是,我不知道如何将每个NSForm绑定到我的NSValueTransformer。我找到了一种不使用NSValueTransformer方法的方法。使用KVC和绑定更容易、更简单。谢谢你的帮助。
    #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