Фильтрация символов, введенных в UITextField
У меня есть UITextField в моем приложении. Я хотел бы ограничить набор символов, которые могут быть введены в поле, в набор, который я определил. Я мог бы фильтровать символы, введенные в поле, когда текст передается с использованием метода UITextFieldDelegate:
- (BOOL)textFieldShouldReturn:(UITextField*)textField
Однако это дает пользователю ложное впечатление, поскольку, хотя ограниченные символы удаляются из окончательного значения, они все еще были явно введены в текстовое поле до нажатия Return/Done/etc. Каков наилучший подход, который предотвратил бы появление ограниченных символов в текстовом поле по мере их выбора на клавиатуре?
Примечание.. Я работаю в предположении, что у меня мало контроля над тем, какие клавиши предоставляются клавиатурой iPhone. Я знаю, что я могу переключаться между различными реализациями клавиатуры, но мне кажется, что я не могу отключить определенные ключи. Это предположение может быть неверным.
Ответы
Ответ 1
Посмотрите textField:shouldChangeCharactersInRange
Этот метод вызывается UITextFieldDelegate
всякий раз, когда набираются новые символы или существующие символы удаляются из текстового поля. Вы можете вернуть NO, чтобы не допустить изменения.
Ответ 2
Я сделал так, как предложил мароккан, и это сработало хорошо. Ниже приведен пример реализации.
Примечание. Имена переменных были выбраны для краткости и не отражают мои стандарты кодирования:
...
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;
}
Ответ 3
Вот один из самых простых подходов к ограничению символов, введенных в 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;
}
Ответ 4
Посмотрите на метод UITextViewDelegate
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
.
Это именно то, что вам нужно.
Ответ 5
Это то, что я использую, чтобы ограничить пользователя верхним регистром A-Z. Отрегулируйте переменную регулярного выражения в соответствии со вкусом:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSString* regex = @"[^A-Z]";
return ([string rangeOfString: regex
options:NSRegularExpressionSearch].location == NSNotFound);
};
Ответ 6
Как насчет этого?
- (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]
, так что вам не нужно писать в регулярном выражении для печатных/маленьких букв.
Ответ 7
Вы можете выполнить цикл и продолжить проверку, изменилось ли свойство UITextField.text после вызова метода DidBeginEditing. Если он есть, проверьте текст и удалите плохие символы.