2009-11-10 3 views
12

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

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

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

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

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

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

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

рефов на кого-н .:Here и here

// 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.Download BugReport_7380723 sample project

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

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

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

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

ответ

0

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

+0

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

4

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

+2

Снова слышите? :) – antsyawn

+0

Слышали ли вы? – Legolas

+0

Я выбираю ответ @ Zac, так как по крайней мере один другой человек, похоже, подтвердил это, но у меня не было возможности пройти тест. – wkw

16

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

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

это работает. вызов select перед setSelectedRange делает видимым синий фон и «lollypops». Опущение выбора вызова приведет к отображению текста, но без индикаторов выбора –

1

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