iphone UITextView не поддерживает детекторы данных, когда текстовое представление доступно для редактирования - PullRequest
11 голосов
/ 20 января 2010

Я получаю интересное предупреждение во время сборки (симулятор iPhone), которое выдает следующее:

EditView.xib:35:0 UITextView does not support data detectors when the text view is editable.

Это в основном не существует в Google, и я хотел бы удалить его.

У моего editview.xib есть текстовое представление, в которое я записываю заметки. Нужна ли еще какая-то информация?

Ответы [ 6 ]

9 голосов
/ 01 марта 2010

У меня есть четыре разных Xib с похожими текстовыми представлениями, которые также используются для заметок. Я получал те же предупреждения. Предложение отключить «Обнаружение телефонных номеров» и «Обнаружение ссылок» действительно удаляет предупреждения. Однако я хотел, чтобы мои пользователи все еще имели возможность использовать детекторы в моих заметках.

Вот как я решил проблему в своем приложении:

  1. В IB: я отменил выбор двух свойств для TextView. - (что останавливает предупреждения о сборке).

  2. В моем - (void)viewDidLoad { я установил следующие свойства textView: myTextView.dataDetectorTypes = UIDataDetectorTypeAll;, который включает детекторы данных всех типов (номера телефонов и адреса URL).

  3. На моем контроллере просмотра: -(void)textViewDidBeginEditing:(UITextView *)sender { метод, я повернул детекторы данных обратно OFF , используя: myTextView.dataDetectorTypes = UIDataDetectorTypeNone

  4. Затем, воспользовавшись методом -(void)textViewDidEndEditing:(UITextView *)sender { , я вернул их обратно ON , используя: myTextView.dataDetectorTypes = UIDataDetectorTypeAll;

Этот метод отключает детекторы данных, когда пользователь редактирует UITextView, и снова включает детекторы данных, когда пользователь заканчивает редактирование. Это исправление позволяло выбирать телефонные номера и URL из textView, чтобы я не потерял функцию.


В документах Apple по DataDetectors for UITextView я обнаружил следующее: после некоторого перебора с UITextView, надеюсь, это поможет.

UIDataDetectorTypes:

Определяет типы информации, которая может быть обнаружена в текстовом содержимом.

Типы:

  • UIDataDetectorTypePhoneNumber;
  • UIDataDetectorTypeLink;
  • UIDataDetectorTypeNone;
  • UIDataDetectorTypeAll;


Обновление: 11-5-2010;

Дополнительное примечание: Детекторы данных недопустимы, если UITextView является «редактируемым», поскольку будет слишком много переменных, чтобы отслеживать изменения пользователя в тексте, а также попытки при попытке выполнить телефонный звонок или ссылки.

Решение: Загрузите TextView с self.textView.editable = NO; и установите UIDataDetector на основе типов, которые я перечислил выше. Таким образом, если пользователь хочет «выбрать» веб-адрес или номер телефона и т. Д., Делегат может справиться. Когда вам нужно, чтобы ваш пользователь отредактировал textView, включите self.textView.editing = YES; и соответственно удалите ваши UIDataDetectors. Это должно гарантировать отсутствие ошибок или предупреждений во время компиляции.

Особое замечание: При повторном включении обязательно сначала удалите датчики данных, затем включите «edit = YES;» ... Порядок важен, чтобы не разрешать редактирование, если UIdatadetectors все еще назначены.

Следовательно, порядок последовательности должен быть примерно таким ...

  • Для редактирования textView: 1. удалить детекторы данных, 2. затем включить редактирование = ДА.

  • Для использования DataDetectors: 1. Отключить редактирование = НЕТ; 2. затем добавьте детекторы данных.

7 голосов
/ 02 февраля 2010

Я тоже видел это предупреждение. Вот как я это исправил:

В xib-файле в Интерфейсном Разработчике выберите текстовое представление и вызовите инспектор атрибутов. Убедитесь, что оба параметра «Обнаруживает номера телефонов» и «Обнаруживает ссылки» НЕ УКАЗАНЫ.

Я проверил «Обнаруживает ссылки», и оказалось, что это было причиной предупреждения. По сути, если текстовое представление редактируемое, вы не хотите, чтобы эти функции автоопределения были включены.

6 голосов
/ 01 марта 2011

Так многословно!

textView.editable = NO;
textView.dataDetectorTypes = UIDataDetectorTypeAll;

URL-адрес должен начинаться с "http://",, иначе текстовое представление не сможет его обнаружить.

2 голосов
/ 26 июня 2013

Я думал о том, чтобы попытаться использовать устройство распознавания жестов с помощью «delaysTouchesBegan = YES» и «cancellsTouchesInView = NO»

Все еще довольно легко решить!

Загрузить вид с отключенными редактируемыми данными, а также UIDataDetectorTypeAll или типы ссылок, которые вы хотите обнаружить. Затем добавьте GestureRecognizer:

UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                             action:@selector(editTextRecognizerTabbed:)];
recognizer.delegate = self;
recognizer.numberOfTapsRequired = 1;
[self.textViewNotes addGestureRecognizer:recognizer];

Таким образом, вы можете изменить настройки в этом методе:

- (void) editTextRecognizerTabbed:(UITapGestureRecognizer *) aRecognizer;
{
    self.textViewNotes.dataDetectorTypes = UIDataDetectorTypeNone;
    self.textViewNotes.editable = YES;
    [self.textViewNotes becomeFirstResponder];
}

И, по крайней мере, вы должны изменить настройки редактирования и обнаружения обратно после того, как пользователь завершил ввод текста:

- (void)textViewDidEndEditing:(UITextView *)textView;
{
    self.textViewNotes.editable = YES;
    self.textViewNotes.dataDetectorTypes = UIDataDetectorTypeAll;
}

работает как очарование!

0 голосов
/ 10 февраля 2011

Simplenote каким-то образом делает это на iOS 4. (Есть бесплатная / облегченная версия на случай, если вы захотите попробовать.)

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

Но когда вы нажимаете и удерживаете обнаруженный dataTpye, он показывает вам меню для вызова, открыть ссылку или что-то еще.

Кроме того, при нажатии внутри текста редактирование действительно начинается с того места, где вы нажали.Таким образом, они каким-то образом удаляют dataDectectors, разрешают редактирование и передают прикосновения к редактируемому UITextview ПОСЛЕ того, как касание распознано.

Есть идеи, как это сделать?

Я думал о попытке использоватьTap-Gesture-Recognizer с «delaysTouchesBegan = YES» и «cancellsTouchesInView = NO»

Таким образом, я могу удалить dataConnectorTypes и установить его редактируемым для метода действия распознавателя, и, надеюсь, доставлены штрихи к UITextviewПосле этого.

Но пока у нас не было времени проверить это.

0 голосов
/ 20 января 2010

Детекторы данных для UITextView будут для копирования и вставки. Поскольку вы устанавливаете его как редактируемый, копирование / вставка не должны быть разрешены там, где вы думаете, что вставка должна, а копирование не должно.

...