Обнаружение ссылок UITextView в iOS 7

У меня есть UITextView, который управляется через Interface Builder. В качестве обнаружения данных у меня есть "Ссылки". В iOS 6 все работает нормально, а ссылки выделены и доступны для просмотра. Однако в iOS 7 все ссылки остаются просто текстовыми. Измененные и выбираемые флажки не отмечены.

Что может быть опасно, так это то, что UITextView является подзором представления контейнера, который снова находится внутри UIScrollView.

Ответ 1

Похоже, что в iOS 7 обнаружение ссылок работает только при выборе UITextView. Поэтому, чтобы мой UITextView не был выбран, остановилось обнаружение ссылки.

Я также тестировал это в iOS 6, и я могу подтвердить, что в iOS 6 обнаружение ссылок работает нормально даже при невозможности выбора UITextView.

Ответ 2

У меня были проблемы с обнаружением телефонных номеров сегодня. Казалось, что UITextView сохранит старые телефонные номера и сохранит текст выделенным после того, как я установил текст на что-то еще.

Я обнаружил, что если setText: nil перед установкой текста в новую строку, это будет reset textview, а номера телефонов будут выделяться как обычно. Мне интересно, если это какая-то ошибка с UITextView в iOS 7.0

В любом случае, это работало для меня.

Ответ 3

Когда iOS7 впервые вышел, это преследовало меня, и я нашел ответ в этом потоке (установив атрибут текста UITextView в ноль, прежде чем устанавливать фактическое значение, сделал трюк). Затем неожиданно проблема (для меня была выделена вся строка, выделенная как ссылка), обрезанная резервная копия (предположительно из-за обновления iOS).

Что, в конце концов, сделало трюк для меня, чтобы прекратить использование текстового атрибута и установить атрибутText. Как только я это сделал, необходимо установить шрифты/прокрутку/выбор/редактирование/etc. программно, исчез. Я определил свой UITextView в IB, задал значения, которые я хотел (не прокручиваемые, не редактируемые, не выбираемые, не обнаруживая ссылки и номера телефонов), а затем построил атрибутную строку и установил:

myUITextView.attributedString = myAttributedString;

И вдруг все сработало, как ожидалось. Надеюсь, это поможет кому-то еще по дороге.

Ответ 4

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

detailTextView.scrollEnabled = NO;
detailTextView.editable = NO;
detailTextView.selectable = YES;

Возможность выбора или наличия прокрутки в iOS6 не требуется.

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

Ответ 5

Проверить, чтобы эти строки были добавлены для использования свойства детектора данных textview в ячейке UItableView.

    txtvwMsgText.userInteractionEnabled = YES;
    txtvwMsgText.dataDetectorTypes = UIDataDetectorTypeLink;
    txtvwMsgText.scrollEnabled = NO;
    txtvwMsgText.editable = NO;
    txtvwMsgText.selectable = YES;

Ответ 6

Вы должны проверить NSDataDetector.

Вы можете использовать это, чтобы находить и обрабатывать разные данные (ссылки, номера телефонов и т.д.). Посмотрите на этом сайте:

http://nshipster.com/nsdatadetector/

Вы также можете использовать свойство dataDetectorTypes UITextView, чтобы указать, что вы хотите обнаружить в коде. Может быть, это просто проблема перехода с раскадровки.

textView.dataDetectorTypes = UIDataDetectorTypeLink;

Ответ 7

Помните, что ваше текстовое представление будет распознавать ссылки только в том случае, если не редактируется!

Вот хороший учебник о том, как сделать editable UITextView с `link detection``

Редактируемый UITextView с привязкой ссылок

С тех пор я не испытывал никаких проблем с этим решением.

Трюк - это GestureRecognizer для создания и устранения/отключения редактирования.

Вы можете применить одно и то же к проблеме selectable / not selectable на iOS7

Ответ 8

После нескольких тестов я нашел решение.

Если вы хотите, чтобы ссылки активны, и вы не включили выделение, вам необходимо изменить gestureRecognizers.

Например, есть 3 указателя LongPressGestureRecognizers. Один для клика по ссылке (minimumPressDuration = 0.12), второй для увеличения редактируемого режима (минимумPressDuration = 0,5), третий для выбора (минимумPressDuration = 0,8). Это решение удаляет LongPressGestureRecognizer для выбора и второго для масштабирования в режиме редактирования.

NSArray *textViewGestureRecognizers = self.captionTextView.gestureRecognizers;
NSMutableArray *mutableArrayOfGestureRecognizers = [[NSMutableArray alloc] init];
for (UIGestureRecognizer *gestureRecognizer in textViewGestureRecognizers) {
    if (![gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]) {
        [mutableArrayOfGestureRecognizers addObject:gestureRecognizer];
    } else {
        UILongPressGestureRecognizer *longPressGestureRecognizer = (UILongPressGestureRecognizer *)gestureRecognizer;
        if (longPressGestureRecognizer.minimumPressDuration < 0.3) {
            [mutableArrayOfGestureRecognizers addObject:gestureRecognizer];
        }
    }
}
self.captionTextView.gestureRecognizers = mutableArrayOfGestureRecognizers;

Протестировано на iOS 9, но оно должно работать на всех версиях (iOS 7, 8, 9). Я надеюсь, что это помогает!:)

Ответ 9

Я нашел трюк, это работает в iOS 7!

Вы должны установить UITextView для выбора в xib или программно

self.yourTextView.selectable = YES;

после чего вам нужно отключить прокрутки и снова включить после установки текста.

self.yourTextView.scrollEnabled = NO;
[self.yourTextView setText:contentString];
self.yourTextView.scrollEnabled = YES;

Ответ 10

Таким образом, используя UITextView, поддерживая его, можно выбирать, а не прокручивать и обнаруживать ссылки не так просто, как кажется. Я столкнулся с этим в iOS 8. Поэтому мое решение состояло в том, чтобы сделать что-то подобное в viewDidLoad, а затем установить редактируемое свойство NO, когда будет выполнено редактирование текстового редактора (обычно это будет метод, подобный doneIsTapped). Трюк здесь заключается в том, чтобы установить редактируемое свойство NO после установки текстового значения в textview. Это позволит использовать ссылки в UITextview.

- (void)viewDidLoad 
{
    [super viewDidLoad];
    self.txtViewComment.editable = YES;
    self.txtViewComment.selectable = YES;
    self.txtViewComment.dataDetectorTypes = UIDataDetectorTypeLink;
    self.txtViewComment.scrollEnabled = NO;
}

и

- (IBAction)doneIsTapped:(id)sender 
{
    self.txtViewComment.text = @"set text what ever you want";
    self.txtViewComment.editable = NO; 
}

это сделало ссылки включенными в textview. Также я бы рекомендовал не использовать доску истории в это время (или пока Apple не решит эту проблему) и просто используйте код, чтобы избежать лишней путаницы. Надеюсь, эта помощь.

Ответ 11

Дезактивация способности прокрутки UITextViews сделала трюк для меня в аналогичной настройке.

Ответ 12

На самом деле работает изменение цвета оттенка на другой цвет. Однако, если выбрано, включение оттенка также будет одного цвета.

Ответ 13

Сделайте свойство прокрутки UITextView равным №, это будет работать... Self.textView.ScrollingEnable = НЕТ;

Ответ 14

Это обходное решение работает для меня:

textView.selectable = YES;
textView.delegate = self;

- (void) textViewDidChangeSelection:(UITextView *)textView;
{
    NSRange range = NSMakeRange(NSNotFound, 0.0);
    if ( range.length && !NSEqualRanges(range, textView.selectedRange) ) {
        textView.selectedRange = range;
    }
}

Ответ 15

Если вы добавляете UITextview программно, просто добавляйте ниже строки:

        _textView.userInteractionEnabled = YES;
        _textView.dataDetectorTypes = UIDataDetectorTypeLink;
        _textView.scrollEnabled = NO;
        _textView.editable = NO;

Это сработало для меня.

Ответ 16

Ни одно из вышеперечисленных не работало для меня, вместо этого я сделал это:

[self.textView setDataDetectorTypes:UIDataDetectorTypeNone];
[self.textView.setTextColor:[UIColor whiteColor]];
[self.textView setDataDetectorTypes:UIDataDetectorTypeNone];

Я сделал это с моим текстовым представлением, которое должно было обнаружить все типы, и у которого не обнаружен цвет, установленный на белый. Вы можете изменить код, чтобы представить свой правильный цвет и типы ссылок для обнаружения.

Ответ 17

Пока эта ветка устарела, я не видел ответа, который работал у меня с Swift, поэтому здесь идет речь о Swift 2.2

textView.dataDetectorTypes = UIDataDetectorTypes.Link
textView.selectable = true