2012-01-26 3 views
1

数値がテキストフィールドに入力される単純なCocoaアプリケーションを作ろうとしています。数字が1つのテキストフィールドに入力されると、他のテキストフィールドは自動的に別の数字で更新されます(逆も同様です)。私がウィンドウにドラッグしたテキストフィールドは、インターフェイスビルダーからの "Number Formatterでのテキストフィールド"です。テキストフィールドを代理人として設定して、自動的に更新できるようにしました。しかし、フォーマットは機能していないようです。私は10進数を入力することはできません。助けてください!!!ここNumber FormatterでNSTextFieldが十進数入力を許可していません

ヘッダファイル:ここ

#import <Cocoa/Cocoa.h> 

@interface AppDelegate : NSObject <NSApplicationDelegate> { 
    IBOutlet NSTextField *number1; 
    IBOutlet NSTextField *number2; 
} 

@property (assign) IBOutlet NSWindow *window; 

@end 

実装ファイル:

#import "AppDelegate.h" 

@implementation AppDelegate 

@synthesize window = _window; 

-(void)controlTextDidChange:(NSNotification *) note { 
    NSTextField *changedField = [note object]; 

    if (changedField == number1) { 
     float num1 = [number1 floatValue]; 
     [number2 setFloatValue: (num1*2.0)]; 
    } 

    if (changedField == number2) { 
     float num2 = [number2 floatValue]; 
     [number1 setFloatValue: (num2/2.0)]; 
    } 
} 

@end 

答えて

1

これは少しあいまいですが、あなたが実際に動作することができないやろうとしているが、代替があります。

あなたが持っているあなたのコードで

float num1 = [number1 floatValue]; 
[number2 setFloatValue: (num1*2.0)]; 

最初の行はnumber1現在値を要求します。 number1に番号付きフォーマッタが付いているので、テキストを書式設定するために呼び出されます。入力した場合、123.と書かれた結果は123 ...となり、小数点は消えます。カンマ(千単位の区切り文字)を入力することはできません。

だから、根本的な問題は後、すべての文字があなたのコードは、その時点で有効な数値することを強制されて入力されていることです。

代わりに、ユーザーが完全な番号を入力したときのみ行動します。それぞれの文字が入力されたときに入力を分析するコードを自分で書くことも、ユーザーがアクションにヒットして応答するまで待つという簡単な方法を使用することもできます。

- (IBAction) textDidChange:(id)sender 
{ 
    if (sender == number1) 
    { 
     float num1 = [number1 floatValue]; 
     [number2 setFloatValue: (num1*2.0)]; 
    } 
    else if (sender == number2) 
    { 
     float num2 = [number2 floatValue]; 
     [number1 setFloatValue: (num2/2.0)]; 
    } 
} 

と「セレクタ」としてコントロールに接続し、あなたが既に持っている「デリゲート」接続を削除:にあなたのコードを変更し、後者を行うには

このソリューションは、試したものよりも「動的」ではありませんが、機能します。動的応答を戻すには、上記のようにより複雑なコードを書く必要があります。

+0

私はそれほど動的ではないアプローチのために提案した変更を行い、10進数を入力できるようにしました。質問? - テキストフィールドの書式を設定すると、45などの45桁の有効数字が表示されます。 – wigging

+0

これを正しく実装する方法の例を示すことができれば、本当に感謝します。 – wigging

+0

@Gavin: 'NSNumberFormatter'の' setMinimumFractionDigits: 'のようなメソッドを見ることができます(そして、' NSTextField'の 'formatter'メソッドを使ってフォーマッタを使用します)。ダイナミックなアプローチでこれらのメソッドを使用したいと思うかもしれませんが(そして小数点表示のために1つあります)、ユーザーが入力するものを変更すると非常に奇妙な振る舞いをします。彼らはそれがだと思います... – CRD

0

パーティーに少し遅れましたが、私はこの問題に直面しましたが、私はダイナミックな更新を維持する簡潔な解決策を見つけたと思いますが、フォーマッターの蹴りすぎを避けて、

- (void)controlTextDidChange:(NSNotification *)aNotification 
{ 
    NSTextView *fieldEditor = [aNotification.userInfo valueForKey:@"NSFieldEditor"]; 
    CGFloat floatValue = fieldEditor.textStorage.string.floatValue; 
    // Getting the new value from the field editor avoids the formatter kicking in here. 
    // You can now use the value as you wish. Probably something like: 
    if (sender == number1) 
    { 
     [number2 setFloatValue: (floatValue*2.0)]; 
    } 
    else if (sender == number2) 
    { 
     [number1 setFloatValue: (floatValue/2.0)]; 
    } 
} 

は(私はブラウザにこれを入力したので、それは完全に正確ではないかもしれないが、十分に近いはずである基本的な部分は最初の2行は、次のとおりです。フィールドエディタを抽出し、そこから新しい価値を引き出します。

1

私は非常に答えが遅いと知っていますが、まったく同じ問題に遭遇し、すばらしい回避策が見つかりました。Bui @ CRDの答えに載っている。私はこの問題をどのように達成

は次のとおりです。

  • ストアフォーマッタ
  • テキストフィールドからフォーマッタを拭き
  • は、テキストフィールドにフォーマッタを再適用テキストフィールド
  • から値を読み

私が行った方法の例は以下の通りです:

-(void)controlTextDidChange:(NSNotification *)obj 
{ 
    if ([obj object]) 
    { 
     NSTextField *field = [obj object]; 
     NSNumberFormatter *formatter = [field formatter]; 
     [field setFormatter:nil]; 
     double data = [field doubleValue]; 
     [field setFormatter:formatter]; 
     // ... 
     // Do other meaningful stuff now 
    } 
} 

それが適切な方法であるかどうかはわかりませんが、うまくいきました。

関連する問題