#ios #objective-c #uitextfield
#iOS #objective-c #uitextfield
Вопрос:
Мне было интересно, возможно ли ограничить то, что UITextField
отображается на основе символов, введенных пользователем при вводе. Например, я хотел бы исключить символ «!» из отображения в UITextField
, чтобы, когда пользователь вводит «Nice!», то, что он видит в текстовом поле, было просто «Nice», с мигалкой рядом с «e».
Я попытался использовать shoudChangeCharactersInRange
и поэкспериментировал с чем-то базовым, например, перевести все введенные слова в нижний регистр, но это не сработало. Каков был бы наилучший способ подойти к этому, особенно если я хочу вообще исключить некоторые буквы или символы? Спасибо
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
[self updateTextLabelsWithText: newString.lowercaseString];
return YES;
}
Комментарии:
1. К вашему сведению — пожалуйста, прекратите использовать тег iPhone для всех ваших вопросов. Это почти никогда не применяется.
2. Готово — я также удалю их из предыдущих вопросов.
3. Какая проблема у вас возникла с опубликованным вами кодом?
4. Примененный код (который изменяет все на строчную строку), похоже, не работает для того, какой текст отображается в
UITextField
. Я могу ввести «HELLO», и оно все равно останется как «HELLO», а не как «привет», как предполагалось.5. Вам нужно будет показать нам
updateTextLabelsWithText:
метод.
Ответ №1:
Обновленный ответ
Хорошо, не могли бы вы попробовать эту версию, пожалуйста, посмотрите, обрабатывает ли она дополнительную вставку строки с недопустимыми символами?
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
BOOL shouldReplace = YES;
NSRange invalidCharRange = [string rangeOfString:@"!"];
if(invalidCharRange.length > 0)
{
shouldReplace = NO;
NSString *cleanedString = [string stringByReplacingOccurrencesOfString:@"!" withString:@""];
NSString *completeString = [[NSString alloc] initWithFormat:@"%@%@", textField.text, cleanedString];
textField.text = completeString;
}
else
{
textField.text = [textField.text stringByReplacingOccurrencesOfString:@"!" withString:@""];
}
if([string isEqualToString:@"!"])
{
shouldReplace = NO;
}
return shouldReplace;
}
Оригинальный ответ
Просто установите NO, если заменяющая строка «!»:
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
BOOL shouldReplace = YES;
if([string isEqualToString:@"!"])
{
shouldReplace = NO;
}
return shouldReplace;
}
Комментарии:
1. Лучше всего ограничить ваш код только соответствующей частью. Методы
viewDidLoad
иdidReceiveMemoryWarning
в ответе не нужны.2. Кроме того, этот ответ завершится ошибкой, если пользователь вставит текст, состоящий более чем из одного символа, и один из вставленных символов является нежелательным символом.
3. Это помогло — спасибо! Отличная мысль о вставке @rmaddy, это тот
UITextField
случай, когда вставка маловероятна, но я настрою некоторые меры предосторожности.4. Я также обновил ответ обработкой вставляемых слов, содержащих недопустимые символы, посмотрите, работает ли это для вас @daspianist. Хотя, если ваши требования изменятся, например, вы хотите фильтровать @ characters в дополнение к ! символы, тогда вам, вероятно, понадобится более надежная функция проверки, которая рекурсивно проверяет каждый недопустимый символ и рекурсивно заменяет их в строке перед ее возвратом.
5. Потрясающе — теперь это отлично работает даже для вставленных строк. Большое спасибо @Zhang!
Ответ №2:
Как насчет этого?
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString *previousString_ = textField.text;
NSString *upperCased_ = [string uppercaseString];
previousString_ = [previousString_ stringByReplacingCharactersInRange:range withString:upperCased_];
[textField setText:previousString_];
return NO;
}
Этот код изменит нижнюю строку ввода на заглавную
Комментарии:
1. Спасибо — это было очень полезно, указав мне правильное направление.