UITextView selectedRange не отображается при программной установке

Моя проблема заключается в том, что программно установка selectedRange UITextView выделяет текст, но визуально не указывает, что он выбран. Похоже ли это на ошибку в OS 3.0/3.1. Что еще более важно, какое-либо решение или предложения для получения выбора для отображения? (образец проекта связан в нижней части сообщения)

Как я узнаю, что он выбран, так как я не получаю визуальную обратную связь? Две причины:

  1. Нет мигающего курсора
  2. Нажатие любой клавиши на клавиатуре удаляет существующий текст в диапазоне выбора.

У меня есть UITextView в viewcontroller, который позволяет редактировать изменяемое пользователем значение. Контроллер редактора открывается при двойном нажатии на строку таблицы или когда пользователь нажимает кнопку раскрытия подробностей в строке. Viewcontroller поступает через presentModalViewController, и в методе viewWillAppear VC редактора я запускаю клавиатуру с помощью [self.textView becomeFirstResponder];

Иногда я хочу запустить редактор с выбранным содержимым всего текстового представления, чтобы пользователь мог просто начать печатать и удалить существующее содержимое (это потому, что я создаю новые элементы с заголовками по умолчанию, так что почти наверняка пользователь сначала удалит) все содержимое текстового поля редактора, затем введите их заголовок).

Некоторые из вещей, которые я уже пробовал:

  1. установка выбранного диапазона в viewDidAppear (вместо и в дополнение к выполнению этого в textViewDidBeginEditing).
  2. Замена _textView.text на копию текста в нем с последующим применением selectedRange (в textViewDidBeginEditing)... думая, может быть, если я имею дело с ошибкой фреймворка, это может обойти это.
  3. [[_textView webView] selectAll]; (частный API). такое же поведение, текст выделяется без визуальной обратной связи.
  4. отправка _textView setNeedsDisplay и setNeedsLayout.
  5. используя executeSelector... afterDelay, чтобы установить selectedRange так, чтобы это происходило после выхода из textViewDidBeginEditing.

ссылки на SO: здесь и здесь

// 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. Это, конечно, не существует. Тем не менее, здесь есть некоторые обходные пути

Другие вопросы по тегам