Фильтрация символов, введенных в UITextField - PullRequest
12 голосов
/ 18 июня 2009

У меня есть UITextField в моем приложении. Я хотел бы ограничить набор символов, которые могут быть введены в поле, набором, который я определил. Я мог бы отфильтровать символы, введенные в поле, когда текст фиксируется с использованием метода UITextFieldDelegate:

- (BOOL)textFieldShouldReturn:(UITextField*)textField

Однако это создает у пользователя ложное впечатление, поскольку, хотя ограниченные символы удаляются из конечного значения, они все еще визуально вводятся в текстовое поле до нажатия Return / Done / и т.д. Каков наилучший подход, при котором запрещенные символы появляются в текстовом поле при их выделении на клавиатуре?

Примечание: Я работаю в предположении, что у меня мало контроля над клавишами, которые предоставляются клавиатурой (-ами) iPhone. Я знаю, что могу переключаться между различными реализациями клавиатуры, но у меня сложилось впечатление, что я не могу отключить определенные клавиши. Это предположение может быть неверным.

Ответы [ 7 ]

25 голосов
/ 19 июня 2009

Я сделал так, как предложил Марк, и это сработало хорошо. Пример реализации следующий.

Примечание: Названия переменных были выбраны для краткости и не отражают мои стандарты кодирования:

    ...
    myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"xyzXYZ"];
    ...
}

- (BOOL) textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)textEntered {
    for (int i = 0; i < [textEntered length]; i++) {
        unichar c = [textEntered characterAtIndex:i];
        if (![myCharSet characterIsMember:c]) {
            return NO;
        }
    }
    return YES;
}
14 голосов
/ 18 июня 2009

Посмотрите на textField:shouldChangeCharactersInRange

Этот метод вызывается UITextFieldDelegate всякий раз, когда вводятся новые символы или существующие символы удаляются из текстового поля. Вы можете вернуть NO, чтобы не допустить изменения.

3 голосов
/ 25 июля 2013

Вот один из самых чистых подходов к ограничению символов, введенных в UITextField. Этот подход позволяет использовать несколько предопределенных наборов NSCharacterSets.

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{

    NSMutableCharacterSet *allowedCharacters = [NSMutableCharacterSet alphanumericCharacterSet];
    [allowedCharacters formUnionWithCharacterSet:[NSCharacterSet whitespaceCharacterSet]];
    [allowedCharacters formUnionWithCharacterSet:[NSCharacterSet symbolCharacterSet]];

    if([string rangeOfCharacterFromSet:allowedCharacters.invertedSet].location == NSNotFound){

        return YES;

    }

    return NO;

}
2 голосов
/ 18 июня 2009

Посмотрите на метод UITextViewDelegate - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string.

Это именно то, что вам нужно.

1 голос
/ 23 сентября 2014

Это то, что я использую, чтобы ограничить пользователя прописными буквами A-Z. Настройте регулярное выражение в соответствии со вкусом:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    NSString* regex = @"[^A-Z]";
    return ([string rangeOfString: regex
                      options:NSRegularExpressionSearch].location == NSNotFound);
};
0 голосов
/ 06 апреля 2015

Как насчет этого?

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    NSString* regex = @"[^a-z]";
    return ([[string lowercaseString] rangeOfString: regex
                      options:NSRegularExpressionSearch].location == NSNotFound);
};

Примечание:

Я делаю все символы в нижнем регистре [string lowercaseString], чтобы вам не нужно было писать в регулярном выражении заглавные / строчные буквы.

0 голосов
/ 18 июня 2009

Вы можете выполнить цикл и продолжать проверять, изменилось ли свойство UITextField.text после вызова метода DidBeginEditing. Если это так, проверьте текст и удалите плохие символы.

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