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