在iPad上......
textField.keyboardType = UIKeyboardTypeDecimalPad;
...只显示常规键盘,但从顶部的数字开始(下面有很多标点符号)。
但是输入一个数字。我只希望用户能够输入数字和小数点,就像UIKeyboardTypeDecimalPad在iPhone上一样。
有没有办法让不相关的密钥消失并让我的用户独自一人?
答案 0 :(得分:8)
设置UITextField
的{{1}}只会让用户更容易输入相应的字符。即使在iPhone上,用户也可以通过硬件键盘输入其他字符,或者用字符串粘贴。
相反,实现keyboardType
的{{1}}来验证用户输入。你也可能不想硬编码数字0-9和句号。例如,某些语言环境中的用户使用逗号分隔小数的整数:
UITextFieldDelegate
或者,您可以在用户根据需要在-textField:shouldChangeCharactersInRange:replacementString:
,- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString *candidate = [[textField text] stringByReplacingCharactersInRange:range withString:string];
if (!candidate || [candidate length] < 1 || [candidate isEqualToString:@""])
{
return YES;
}
NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:candidate];
if (!number || [number isEqualToNumber:[NSDecimalNumber notANumber]])
{
return NO;
}
return YES;
}
或–textFieldShouldReturn:
完成文字输入时执行验证。
答案 1 :(得分:2)
这不一定是万无一失的解决方案,但它符合我的需求,可能对其他人有所帮助。关注的是数字字符是硬编码的。我不确定使用其他数字字符的语言环境,但可以根据需要添加它们。
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString *candidate = [[textField text] stringByReplacingCharactersInRange:range withString:string];
// Ensure that the local decimal seperator is used max 1 time
NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
NSString *decimalSymbol = [formatter decimalSeparator];
if ([candidate componentsSeparatedByString:decimalSymbol].count > 2) return NO;
// Ensure that all the characters used are number characters or decimal seperator
NSString *validChars = [NSString stringWithFormat:@"0123456789%@", decimalSymbol];
if ([candidate stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:validChars]].length) return NO;
return YES;
}
答案 2 :(得分:1)
我知道这个问题已经暂停了很长一段时间,但这可能会帮助那些人。
您可以尝试实施此https://github.com/azu/NumericKeypad。编码器实现了他自己的数字键盘购买子类化UITextField
答案 3 :(得分:0)
将此链接到textField的editingChanged
方法。您可以根据需要编辑周围的字符。
- (IBAction)numberValidator:(id)sender {
NSMutableString *txt1 = [[NSMutableString alloc] initWithString:_numbersOnlyField.text];
for (unsigned int i = 0; i < [txt1 length]; i++) {
NSString *character = [[NSString alloc] initWithFormat:@"%C", [txt1 characterAtIndex:i]];
// Erase any characters you don't like, but you don't feel the user needs to be alerted about
else if ([character isEqualToString:@" "]){
[txt1 deleteCharactersInRange:NSMakeRange(i, 1)];
_numbersOnlyField.text = [[NSString alloc] initWithString:txt1];
}
// Alert the user that they shouldn't enter anything besides numbers
if ([character integerValue] == 0 && ![character isEqualToString:@"0"]) {
UIAlertView *alert = [[UIAlertView alloc]initWithTitle: @"Numbers only please!"
message: @"Please only enter numbers in the \"<your text field's name here>\" text field"
delegate: nil
cancelButtonTitle:@"Sorry..."
otherButtonTitles:nil];
[alert show];
[txt1 deleteCharactersInRange:NSMakeRange(i, 1)];
_numbersOnlyField.text = [[NSString alloc] initWithString:txt1];
}
}
}
您也可以通过UIControlEventValueChanged
方法以编程方式执行此操作。
这只是我自己提出的一个解决方案,我绝对不认为自己是专业人士,因此我可能会忽略一些缺陷,但这对我来说非常有效。