Подтвердить что ты не робот

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

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

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

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

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

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

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

  • установка выбранного диапазона в viewDidAppear (вместо этого и в дополнение к его выполнению в textViewDidBeginEditing).
  • Замена _textView.text с копией текста в нем, а затем использование выделенногоRange (в textViewDidBeginEditing)... мышление, возможно, если я имею дело с ошибкой фреймворка, это может обойти его.
  • [[_textView webView] selectAll]; (частный api). такое же поведение, текст выбирается без визуальной обратной связи.
  • отправка _textView setNeedsDisplay и setNeedsLayout.
  • с помощью функции performSelector... afterDelay для установки выбранного диапазона так, чтобы это произошло после выхода из 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);
 }
}

- EDIT -
Здесь образец проекта представлен Apple BugReporter. Загрузить образец проекта BugReport_7380723

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

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

  • Когда выбран текст, но нет выделенного выделения, коснитесь нажатия клавиш, затем "встряхните, чтобы отменить", и исходный текст будет восстановлен , но IS выделен.

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

4b9b3361

Ответ 1

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

[textView select:self];
textView.selectedRange = newSelectedRange; 

Ответ 2

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

Ответ 3

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

Ответ 4

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