Вопрос о фильтре клавиатуры iPhone

Я хочу ограничить количество символов, которые пользователи могут вводить на клавиатуре iPhone, поэтому я создал собственный массив. Например, массив, включающий 0 ~ 9 и точку, чтобы позволить пользователям вводить цену. Тогда я могу return NOдля -(BOOL)textField:shouldChangeCharactersInRange:replacementString:если заменить строку не в массиве.

Проблема в том, что кнопка возврата также отключена, когда я использую этот массив для фильтрации текста. Любые идеи о том, как включить кнопку возврата?

Другая проблема заключается в том, что я хочу позволить пользователям вводить их имена, и поэтому я не хочу, чтобы они переключались на цифры и знаки пунктуации (кнопка возврата также блокируется, если я использую массив для фильтрации). Как отключить кнопку переключения на клавиатуре (теперь я просто ограничиваю их вводом ~ z, пробела и ".", Но я думаю, что отключение кнопки переключения может быть лучше)?

13.10.2009 02:22:32
3 ОТВЕТА
РЕШЕНИЕ

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

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if(textField == txtChargeAmt)
    {
        if(string.length == 0)  //backspace button is pressed
        {
            textField.text = [textField.text substringToIndex:(textField.text.length - 1)];
            return NO;
        }

        for(NSString *s in arrNumberAndDot)
        {
            if([string isEqualToString:s])
            {
                return YES;
            }
        }
        return NO;
    }
    else
        return YES;
}

Другие идеи по поводу проблемы возврата приветствуются. А как отключить кнопку выключателя тогда?

1
13.10.2009 02:49:47

Я думаю, я не уверен, почему вы хотите использовать один и тот же TextField для этих двух разных типов ввода.

У меня было бы два поля, буквенно-цифровое поле для ввода имени и числовое поле для ввода номера.

Или я не понимаю ваш вопрос?

0
13.10.2009 03:23:58
Ничего. Я вижу, что цифровая клавиатура APple действительно такая же, как телефонная клавиатура. Та же схема и без десятичной точки. Почему?
mahboudz 13.10.2009 03:44:52
Я не использую тот же TextField. Как вы можете видеть, я использую txtChargeAmt для ввода цены, а другие текстовые поля могут позволить мне вводить другие строки, такие как имя / фамилия.
Chilly Zhong 13.10.2009 04:51:48

Это будет делать то, что вы хотите немного более кратко (и эффективно):

- (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)string
{
    NSCharacterSet *validCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@".0123456789"];

    BOOL shouldChange = 
        [string length] == 0 || // deletion
        textField != txtChargeAmt || // not the field we care about
        [string rangeOfCharacterFromSet:validCharacterSet].location != NSNotFound;

    if (!shouldChange)
    {
        // Tell the user they did something wrong.  There's no NSBeep() 
        // on the iPhone :(
    }

    return shouldChange;
}

Я бы сконструировал этот набор символов где-нибудь еще, чтобы вам пришлось делать это только один раз, но вы поняли идею. У кого-нибудь есть мысли о том, что делать, чтобы предупредить пользователя, что он использовал недопустимый символ? Я пытаюсь решить подобную проблему.

0
12.11.2009 03:06:35
Вы можете использовать CoreAnimation, чтобы быстро встряхнуть textField, как, например, окно входа в Mac OS X, когда оно отклоняет ваш пароль. Не уверен, насколько это здорово, но это мысль.
jbrennan 12.11.2009 03:14:59