UITextViewDelegate поведение, когда клавиша Backspace находится в состоянии HELD Down
Я столкнулся с проблемой, когда iOS выдает неверную информацию UITextViewDelegate, когда клавиша удаления удерживается на клавиатуре.
Когда пользователь удерживает клавишу удаления на UITextView на iPad, UITextView начинает удалять целые слова вместо отдельных символов, чем дольше он удерживается (примечание: это не происходит в симуляторе).
Когда это происходит, метод делегата UITextView:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
Получает вызов с диапазоном, состоящим из правильного расположения курсора, но с длиной 1. Это неверно, поскольку UITextView теперь удаляет целые слова, а не отдельные буквы. Следующий код, например, будет печатать только один пробел.
[textView substringWithRange:range]
string contains " "
Несмотря на то, что UITextView удаляет целое слово. Текст замены правильно указан как пустая строка. Кто-нибудь знает решение или обход этой проблемы?
1 ответ
Джейкоб упомянул, что я должен опубликовать это как ответ. Так и здесь.
Мой хакерский обходной путь к этому состоит в том, чтобы контролировать длину текста и диапазон, указанный в mustChangeTextInRange, а затем сравнить его с длиной текста в textViewDidChange. Если различия не синхронизированы, я очищаю свой резервный текстовый буфер и перестраиваю его из текстового представления. Это не оптимально. Вот мой временный обходной путь:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
//Push the proposed edit to the underlying buffer
[self.editor.buffer changeTextInRange:range replacementText:text];
//lastTextLength is an NSUInteger recording the length that
//this proposed edit SHOULD make the text view have
lastTextLength = [textView.text length] + ([text length] - range.length);
return YES;
}
- (void)textViewDidChange:(UITextView *)textView
{
//Check if the lastTextLength and actual text length went out of sync
if( lastTextLength != [textView.text length] )
{
//Flush your internal buffer
[self.editor.buffer loadText:textView.text];
}
}