UITextField - UIKeyboardTypeDecimalPad на iPad? - PullRequest
7 голосов
/ 15 июня 2011

На iPad ...

textField.keyboardType = UIKeyboardTypeDecimalPad;

... просто показывает обычную клавиатуру, но начиная с цифр сверху (с большим количеством знаков препинания внизу).

Ноэто ввести номер.Я только хочу, чтобы пользователи могли набирать цифры и десятичную точку, как это делает UIKeyboardTypeDecimalPad на iPhone.

Есть ли способ заставить неактуальные клавиши уйти и оставить моего пользователя одного?

Ответы [ 4 ]

8 голосов
/ 12 августа 2011

Установка UITextField keyboardType облегчает пользователю только ввод соответствующих символов. Даже на iPhone пользователи могут вводить другие символы с помощью аппаратной клавиатуры или вставляя строку.

Вместо этого реализуйте UITextFieldDelegate -textField:shouldChangeCharactersInRange:replacementString: для проверки ввода пользователя. Вы также, вероятно, не очень хотите жестко кодировать цифры 0-9 и точку. Например, пользователи в некоторых локалях отделяют целые числа от десятичных знаков запятой:

- (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:, – textFieldShouldEndEditing: или – textFieldDidEndEditing: по желанию.

2 голосов
/ 19 июля 2013

Это не обязательно надежное решение, но оно соответствует моим потребностям и может быть полезным для других. Беспокойство будет заключаться в том, что число символов жестко закодировано. Я не уверен в локалях, которые используют символы других чисел, но их можно добавлять по мере необходимости.

- (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;
}
1 голос
/ 29 мая 2012

Я знаю, что этот вопрос неактивен в течение долгого времени, но это может кому-то помочь.

Вы можете попробовать реализовать этот https://github.com/azu/NumericKeypad. Кодер реализовал свой собственный подкласс для покупки цифровой клавиатуры.UITextField

0 голосов
/ 23 января 2014

Свяжите это с методом editingChanged вашего textField. Вы можете редактировать персонажей по своему усмотрению.

- (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.

Это просто решение, которое я придумал сам, и я определенно не считаю себя профессионалом, поэтому я могу упускать из виду некоторые недостатки, но для меня это очень хорошо работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...