К сожалению, это не так просто, потому что textView:shouldChangeTextInRange: replacementText:
не обязательно вызывается с односимвольными строками. Он предназначен для ввода с клавиатуры, но не при вставке или при использовании распознавания речи для ввода текста.
Так что вы хотите сделать, если пользователь вставляет (или диктует) строку, содержащую запрещенные символы? Возможно, вы захотите пропустить весь действительный текст и только удалить (или заменить) ненужные символы.
Неправильная идея - исправить текст в подпрограмме делегата textViewDidChange:
. Хотя это, кажется, работает, это как-то мешает речевому вводу работать в UITextView
.
Правильная идея - реализовать textView:shouldChangeTextInRange: replacementText:
с полной фильтрацией. Вот пример реализации, которая отфильтровывает переводы строки:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
if([text isEqualToString:@"\n"]) {
[textView resignFirstResponder]; // dismiss keyboard
return NO;
}
text = [text stringByReplacingOccurrencesOfString:@"\n" withString:@" "]; // replace by spaces
NSString *fullText = [textView.text stringByReplacingCharactersInRange:range withString:text];
textView.text = fullText;
return NO;
}
Обратите внимание, что клавиатура закрывается, когда пользователь нажимает клавишу ввода. Но не совсем идеально: он также отклонит клавиатуру, когда пользователь вставит один символ новой строки. Это может быть проблемой, но это должно случаться очень редко.