ダイナミックユニットコンバータの作成に問題があります。私は2つのテキストフィールドを持っています:1つは「インチ」用で、もう1つは「フィート」用です。私の目標は、数字が入力されている間にインチを足に変換し、逆もまた同様です。 「Enter」または「Tab」ボタンが押されたときではなく、アクションが動的に起こるようにしたい。NSTextFieldの数値を動的に更新する
NSTextField with 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
誰もが「入力」または「タブ」キーを押さなくても、これを達成する方法を教えてもらえますか?
...今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を実装する方法を詳しく説明できますか?私は以前はそれらを使ったことがありません。 – wigging
@Gavin updated answer – justin
バインディングで "Model Key Path"を宣言するにはどうすればよいですか? – wigging