UITextView selectedRange не отображается при программной установке - PullRequest
12 голосов
/ 10 ноября 2009

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

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

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

У меня есть UITextView в 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.

ссылается на S.O.: Здесь и здесь

// 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 ]

16 голосов
/ 12 июля 2010

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

[textView select:self];
textView.selectedRange = newSelectedRange; 
4 голосов
/ 15 ноября 2009

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

1 голос
/ 02 сентября 2010

Внезапно встретите этот вопрос. У меня была такая же проблема, пока я не проверил заголовок объявления 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
0 голосов
/ 10 ноября 2009

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

...