0

Interface Builder でテキストフィールドを作成し、NSNumberFormatter をセルに貼り付けました。ただし、ユーザーは引き続きテキスト フィールドにテキストを入力できます。インターフェイスビルダーを使用して入力を数値のみに制限する方法はありますか? それが NSNumberFormatter のポイントだと思いました。

4

2 に答える 2

0

NSNumberFormatterサブクラスを作成し、これを実装に配置します。コードで、YKKNumberFormatterをNSTextField/UITextFieldのフォーマッターとして設定します。

@implementation YKKNumberFormatter

- (BOOL)isPartialStringValid:(NSString *)partialString newEditingString:(NSString **)newString errorDescription:(NSString **)error {
    // Make sure we clear newString and error to ensure old values aren't being used
    if (newString) { *newString = nil;}
    if (error) {*error = nil;}

    static NSCharacterSet *nonDecimalCharacters = nil;
    if (nonDecimalCharacters == nil) {
        nonDecimalCharacters = [[[NSCharacterSet decimalDigitCharacterSet] invertedSet] retain];
    }

    if ([partialString length] == 0) {
        return YES; // The empty string is okay (the user might just be deleting everything and starting over)
    } else if ([partialString rangeOfCharacterFromSet:nonDecimalCharacters].location != NSNotFound) {
        return NO; // Non-decimal characters aren't cool!
    }

    return YES;
}

@end
于 2012-11-21T20:11:56.737 に答える
0

すべてのフォーマッタには次のメソッドがあります。

- (BOOL) getObjectValue: (id*) object forString: (NSString*) string 
    errorDescription: (NSError**) error;

これは、すべてのフォーマッターに有効です。
文字列が有効でない場合は false を返し、引数として渡された (逆参照された) オブジェクトは nil になります。
そのため、数値フォーマッタをテキスト フィールドにドロップする代わりに、独自のフォーマッタをインスタンス変数として使用します。デリゲート プロトコルを実装するテキスト フィールドを観察して、テキストが変更されるたびに通知されるようにします。
次に、このメソッドを呼び出します。

NSNumber* number;
BOOL success=[formatter getObjectValue: &number forString: [myTextField stringValue] errorDescription:nil];

この時点で、success が false (または number が nil かどうかを確認) の場合は、テキスト フィールドに無効な文字列があるため、より適切なアクションを実行します (文字列全体を削除するか、値として 0.0 を表示するなど)。

別の方法もあります:

- (BOOL) isPartialStringValid : (NSString*) partialString: (NSString*) partialString
    errorDescription: (NSString*) error;

このようにして、部分的な文字列が有効かどうかを知ることができます。たとえば、科学表記法では「1e」は有効ではありませんが、ユーザーが 1 を追加すると「1e1」になるため、部分的に有効です。

于 2012-11-21T18:43:31.810 に答える