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

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

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

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

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

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

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

  1. установка выбранного диапазона в viewDidAppear (вместо и в дополнение к тому, чтобы делать это в textViewDidBeginEditing).
  2. Заменив _textView.text копией текста в нем, затем применив selectedRange (в textViewDidBeginEditing) ... подумав, может быть, если я имею дело с ошибкой фреймворка, это может обойти ее.
  3. [[_textView webView] selectAll]; (частный API). такое же поведение, текст выделяется без визуальной обратной связи.
  4. отправка _textView setNeedsDisplay и setNeedsLayout.
  5. используя performSelector ... 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

Дополнительная информация:

Создавая образец проекта и играя с ним, я обнаружил две вещи:

  • Когда текст выделен, но не отображается, нажмите несколько клавиш, затем «встряхните, чтобы отменить», и исходный текст будет восстановлен, но ЕСТЬ выделен.

  • Если вы вручную сделаете выбор в текстовом окне, а затем нажмите кнопку «Выбрать все» [относится к образцу проекта, ссылка на который приведена выше], весь текст будет выбран И отобразит выделение правильно.


person wkw    schedule 10.11.2009    source источник


Ответы (4)


Прежде чем программно установить выделение в textView, просто вызовите select, чтобы он отображал новое выделение визуально. Например:

[textView select:self];
textView.selectedRange = newSelectedRange; 
person Zac    schedule 12.07.2010
comment
это работает. вызов select перед setSelectedRange делает видимым синий фон и «леденцы». Пропуск вызова select приведет к выделению текста, но без индикаторов выбора - person Jaysen Marais; 28.07.2010

Я отвечу на свой вопрос сейчас и обновлю его позже, когда появится дополнительная информация (или если кто-то другой найдет подходящее решение, я с радостью перенесу проверку на его ответ). У меня есть отчет об ошибке в Apple, и после отправки образца кода он находится в открытом состоянии. Я почти уверен, что это ошибка, поэтому, когда я получу от них ответ, я перейду сюда.

person wkw    schedule 15.11.2009
comment
Я выбираю ответ @Zac, поскольку по крайней мере еще один человек, кажется, подтвердил его, но у меня не было возможности проверить это. - person wkw; 27.04.2012

Вдруг встречу такой вопрос. У меня была такая же проблема, пока я не проверил заголовок объявления 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
person vtloc    schedule 02.09.2010

Обходной путь: похоже, вам нужна функциональность заполнителя UITextView. Этого, конечно, не существует. Однако есть некоторые обходные пути здесь

person Andiih    schedule 10.11.2009
comment
Спасибо за предложение обходного пути. Но в данном случае это действительно не заполнитель. У меня есть объект с определенным редактируемым заголовком; заполнитель исчезнет, ​​когда поле откроется для редактирования. Мой текст должен остаться, но указать, что он выбран, и, таким образом, действие клавиатуры заменит выделение, или им нужно нажать в поле, чтобы убить выделение. Более того, виджет любого типа, поддерживающий выбор, должен указывать на выбранное состояние, так что это, скорее всего, ошибка (я отправил отчет об ошибке сразу после публикации здесь). Меня больше интересуют обходные пути, позволяющие отображать выбор. Спасибо. - person wkw; 10.11.2009