入力を検査する他の理由があるかもしれません。(「\ 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;
}