UITextView selectedRange не отображается при программной установке
Моя проблема заключается в том, что программно установка selectedRange UITextView выделяет текст, но визуально не указывает, что он выбран. Похоже ли это на ошибку в OS 3.0/3.1. Что еще более важно, какое-либо решение или предложения для получения выбора для отображения? (образец проекта связан в нижней части сообщения)
Как я узнаю, что он выбран, так как я не получаю визуальную обратную связь? Две причины:
- Нет мигающего курсора
- Нажатие любой клавиши на клавиатуре удаляет существующий текст в диапазоне выбора.
У меня есть UITextView в viewcontroller, который позволяет редактировать изменяемое пользователем значение. Контроллер редактора открывается при двойном нажатии на строку таблицы или когда пользователь нажимает кнопку раскрытия подробностей в строке. Viewcontroller поступает через presentModalViewController, и в методе viewWillAppear VC редактора я запускаю клавиатуру с помощью [self.textView becomeFirstResponder];
Иногда я хочу запустить редактор с выбранным содержимым всего текстового представления, чтобы пользователь мог просто начать печатать и удалить существующее содержимое (это потому, что я создаю новые элементы с заголовками по умолчанию, так что почти наверняка пользователь сначала удалит) все содержимое текстового поля редактора, затем введите их заголовок).
Некоторые из вещей, которые я уже пробовал:
- установка выбранного диапазона в viewDidAppear (вместо и в дополнение к выполнению этого в textViewDidBeginEditing).
- Замена _textView.text на копию текста в нем с последующим применением selectedRange (в textViewDidBeginEditing)... думая, может быть, если я имею дело с ошибкой фреймворка, это может обойти это.
[[_textView webView] selectAll];
(частный API). такое же поведение, текст выделяется без визуальной обратной связи.- отправка _textView setNeedsDisplay и setNeedsLayout.
- используя executeSelector... afterDelay, чтобы установить selectedRange так, чтобы это происходило после выхода из textViewDidBeginEditing.
// UITextFieldDelegate Methods...
- (void)textViewDidBeginEditing:(UITextView *)_textView
{
NSInteger len = [_textView.text length];
if( self.selectInitialText ){
//NOTE: this is not working as expected. Indeed the text is
// selected but the highlighting of the text isn't showing.
_textView.selectedRange = NSMakeRange(0,len);
}
}
-- РЕДАКТИРОВАТЬ --
Вот пример проекта, представленный в Apple BugReporter. Скачать пример проекта BugReport_7380723
Дополнительная информация:
Создавая и играя с примером проекта, я обнаружил две вещи:
Когда текст выделен, но подсветка не отображается, нажмите несколько нажатий клавиш, затем "встряхните, чтобы отменить", и исходный текст будет восстановлен, но выделен.
Если вы сделаете выделение вручную в текстовом представлении, а затем нажмите кнопку "Выбрать все" [относится к примеру проекта, связанному выше], весь текст будет выделен И правильно отобразит выделение.
4 ответа
Перед программной настройкой выделения в textView просто вызовите select, чтобы визуально отобразить новый выбор. Например:
[textView select:self];
textView.selectedRange = newSelectedRange;
Сейчас я отвечу на свой вопрос и обновлю его позже, когда появится больше информации (или, если кто-то найдет подходящую работу, я с радостью перенесу чек на их ответ). Я получил сообщение об ошибке в Apple, и после отправки примера кода, он сидит там с открытым статусом. Я вполне уверен, что это ошибка, поэтому, когда я получу ответ от них, я передам здесь.
Внезапно встретить этот вопрос. У меня была такая же проблема, пока я не проверил заголовок объявления NSObject. Они уже предоставили функцию с именем selectAll:
@interface NSObject(UIResponderStandardEditActions) // these methods are not implemented in NSObject
- (void)cut:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
- (void)copy:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
- (void)paste:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
- (void)select:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
- (void)selectAll:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
- (void)delete:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_2);
@end
Обходной путь: По-видимому, вам нужна функциональность заполнителя UITextView. Это, конечно, не существует. Тем не менее, здесь есть некоторые обходные пути