2

どこにも見つからない簡単な質問があります。テキスト フィールドを数字、小数、マイナス記号のみに制限しています。しかし、そうする中で、リターンキーをオフにしました。iOS の return キーの unichar 番号を知っている人はいますか? 13 だと思っていたのですが、うまくいきません。

 - (BOOL)textField:(UITextField *)textField 
 shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
 {
     NSUInteger lengthOfString = string.length;
for (NSInteger loopIndex = 0;  loopIndex < lengthOfString; loopIndex++)
     {
         unichar character = [string characterAtIndex:loopIndex]; 
         if (character < 45) return NO; //45 - 57 we want
         if (character > 57) return NO; // -./0123456789
         if (character == 47) return NO; //47 we dont want, it is 
 //             if (character  == 36) return YES
     }
NSUInteger newLength = [textField.text length] + [string length] - range.length;
return (newLength > 5) ? NO : YES;
 }
4

2 に答える 2

2

入力を検査する他の理由があるかもしれません。(「\ n」と比較するとうまくいくと思います)が、これはさらに良いかもしれません:

-(BOOL)textFieldShouldReturn:(UITextField *)textField

編集

浮動小数点入力の処理のより完全な処理は、次のようになります。重要なアイデアは、提案された置換を使用して候補文字列を作成し、次に文字列全体の構文の妥当性をテストすることです。このようにして、コードに触れることなく、任意の位置に新しいテキストを貼り付けるユーザーを処理できます。正規表現は、構文を指定するためのコンパクトで迅速な方法にすぎません。独自のメソッドをバリデーターに入れることができます。

(マイナス記号は文字通り入力の一部としてではなく、負の数が必要であることを示す指標として扱いたいと思うかもしれません。また、長さの制限は、単に合計文字数ではなく、有効数字に対するものであると仮定しました)

// answers true for a valid floating point literal, notwithstanding length
- (BOOL)isValidFloat:(NSString *)string {

    // optional sign, followed by zero or more digits, followed by decimal, followed by zero or more digits
    NSString *regex = @"([-+]?[0-9]*\\.?[0-9]*)";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    return [predicate evaluateWithObject:string];
}

#define kMAX_DIGITS  5

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    NSString *currentText = textField.text;
    NSString *candidateText = [currentText stringByReplacingCharactersInRange:range withString:string];

    // accept a minus sign at any time. Place it in front if it's not already there
    if (string.length == 1 && [string characterAtIndex:0]=='-') {
        if ([currentText rangeOfString:string].location == NSNotFound) {
            textField.text = [string stringByAppendingString:currentText];
            // since we just inserted the minus, answer no so it won't be inserted twice
            return NO;
        }
    }

    // the decimal and minus sign don't count against the length constraint
    NSInteger decimalFudge = ([candidateText rangeOfString:@"."].location != NSNotFound)? 1 : 0;
    NSInteger minusFudge = (candidateText.length > 0 && [candidateText characterAtIndex:0]=='-')? 1 : 0;
    NSInteger maxLength = kMAX_DIGITS + decimalFudge + minusFudge;

    return (candidateText.length <= maxLength) && [self isValidFloat:candidateText];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;
}
于 2012-04-29T23:59:52.683 に答える
1

KeyCode 番号 36 はどうですか?

このリンクの答えを見てください: NSTextField はリターン キー イベントを 2 回キャプチャします

とにかく、これらの制限を無効にして、すべての入力キーの NSLog を実行して、戻り値の unichar 数を取得することができます。

于 2012-04-29T23:58:32.190 に答える