2012-02-01 10 views
1

ダイナミックユニットコンバータの作成に問題があります。私は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 

答えて

2

あなたはNSValueTransformer Sを使用して値をバインドすることができます。

NSValueTransformerは、オブジェクト変換をオブジェクトに提供します。これは、XIBおよびバインディングでも使用できます。システムはいくつかを定義しており、自分で定義することもできます。 AppleのTemperatureConverterサンプルは、NSValueTransformerの紹介のための良い出発点になります。 + [ApplicationDelegate initialize]

をサンプリングする応答で

更新、あなたはプログラムが必要とするすべての変圧器を登録し表示されます。彼らは@"centrigradeFromKelvin"のような名前に登録します。

必要なトラフが登録されたら、NIBでトランスを使用できます。 TemperatureConvertoerの例では、次のことができます。

  1. 選択フォームセルフォームのセルに移動 - フィールドを表示するには摂氏
  2. を押してCMD + OPT + 7バインディング
  3. は値がバインドされていますSharedDefaultsの値 - 値トランスフォーマは "centrigradeFromKelvin"として設定されます。
+0

私のコードでNSValueTransformerを実装する方法を詳しく説明できますか?私は以前はそれらを使ったことがありません。 – wigging

+0

@Gavin updated answer – justin

+0

バインディングで "Model Key Path"を宣言するにはどうすればよいですか? – wigging

関連する問題