10

私は NSNumberFormatter を使用して完全に当惑しています。これは完全に単純なはずですが、動作させることができません。

小数点の有無にかかわらず、10 進数を入力できるように NSTextField を設定したいと思います。これが私がうまくいくと思うものです:

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setMinimumFractionDigits:0];
[formatter setMaximumFractionDigits:4];
[formatter setAllowsFloats:YES];
[[timeFlowMultiplierTF cell] setFormatter:formatter];

ただし、テキストフィールドに入力するときに、小数点の「ピリオド」キーを押しても、小数点が表示されません。「3.14」と入力すると「314」と表示されます。[formatter setAlwaysShowsDecimalSeparator:YES] をスローすると、最初は数値が正しくフォーマットされますが、それを上書きすると、再び小数点を入力できなくなります。

ここで何が欠けていますか?あなたはこれが本当に簡単だと思うでしょう

4

2 に答える 2

12

これは約4年遅れていることに気づきましたが、私はこれと同じナンセンスに遭遇し、後世のために問題が何であるか(または可能性があるか)を共有したいと考えました.

NSTextField のすべての値アクセサー ( -objectValue-stringValue-doubleValueなど) はすべて を呼び出すことになり-validateEditingます。-validateEditing次に、添付NSFormatterされた を使用して編集されたテキストをオブジェクト値に変換し、再フォーマットされた値でフィールド内のテキストをリセットします

そのため、ユーザーがフィールドを編集するときにフィールドを監視するコードがあり、フィールドの値を「のぞき見る」と、テキスト フィールドのテキストを誤って再フォーマットおよびリセットしていることになります。

テキスト フィールドにピリオドを入力できないわけではありません。テキスト フィールドには既に「3」が含まれており、ピリオドを入力するとテキストが「3.」に変わります。次に、フィールド内の何かが変更されるたびに実行されるアクション/通知/デリゲート メソッドがあり、-タイプの値メソッドのいずれかを呼び出すと、「3.」「3」としてフォーマットされ、セルが更新され、入力したばかりのピリオドが消去されます。

私のハックは、 -タイプのValue メソッドを避け、オブジェクトを覗いて、NSTextトリガーせずに編集されたテキストを直接取得することでした-validateEditing:

// some method that runs every time the field changes...
NSTextField* valueField = self.valueField;
NSNumberFormatter* fieldFormatter = valueField.formatter;
NSText* fieldEditor = valueField.currentEditor;
id newValue = ( fieldEditor!=nil ? [fieldFormatter numberFromString:fieldEditor.string] : valueField.objectValue );
于 2015-10-24T20:47:05.063 に答える
1

@James Bucanekの回答に感謝し、それに従ってください。controlTextDidChangeこれは、ユーザーが小数点を入力するのをブロックしなかった委任メソッドをオーバーライドしたときに使用したSwift実装です。またenabled、有効な (つまり、ゼロ以上の長さの文字列) エントリがあるかどうかに応じて、インターフェイスのボタンのフラグを更新します。

override func controlTextDidChange(notification: NSNotification) {
            if let formatter: NSNumberFormatter? = self.user_textfield.formatter as? NSNumberFormatter {
                if let field_editor: NSText = self.user_textfield.currentEditor() {
                    if let new_value: Float? = formatter!.numberFromString(field_editor.string!)?.floatValue {
                        self.my_button_out.enabled = new_value > 0.0
                    } else {
                        self.my_button_out.enabled = false
                    }
                }
            }
        }
于 2016-07-12T10:40:46.797 に答える