UITextField - iPad上的UIKeyboardTypeDecimalPad?

时间:2011-06-14 21:42:08

标签: objective-c ios ipad keyboard

在iPad上......

textField.keyboardType = UIKeyboardTypeDecimalPad;

...只显示常规键盘,但从顶部的数字开始(下面有很多标点符号)。

但是输入一个数字。我只希望用户能够输入数字和小数点,就像UIKeyboardTypeDecimalPad在iPhone上一样。

有没有办法让不相关的密钥消失并让我的用户独自一人?

4 个答案:

答案 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方法以编程方式执行此操作。

这只是我自己提出的一个解决方案,我绝对不认为自己是专业人士,因此我可能会忽略一些缺陷,但这对我来说非常有效。