web-dev-qa-db-fra.com

Détection de lien UITextView dans iOS 7

J'ai un UITextView qui est géré via Interface Builder. En tant que détection de données, j'ai vérifié "Liens". Sous iOS 6, tout fonctionne correctement et les liens sont mis en surbrillance et cliquables. Dans iOS 7, tous les liens restent simplement du texte brut. Les cases à cocher modifiables et sélectionnables ne sont pas cochées.

Ce qui peut être préoccupant, c'est que UITextView est une sous-vue d'une vue conteneur qui se trouve à nouveau dans un UIScrollView.

57
Tobias

Il semble que dans iOS 7, la détection de lien ne fonctionne que si le UITextView est sélectionnable. Donc, rendant mon UITextView non sélectionnable impossible, la détection de lien ne fonctionnait plus.

J'ai également testé cela dans iOS 6 et je peux confirmer que dans iOS 6, la détection de lien fonctionne correctement, même si le UITextView n'est pas sélectionnable.

68
Tobias

J'ai eu quelques problèmes avec la détection de numéro de téléphone aujourd'hui. Il semblait que UITextView conserverait les anciens numéros de téléphone et garderait le texte en surbrillance après avoir réglé le texte sur autre chose.

J'ai trouvé que si je définissaisText: nil avant de définir le texte sur la nouvelle chaîne, la vue texte serait réinitialisée et les numéros de téléphone surlignés seraient mis en évidence normalement. Je me demande s'il s'agit d'une sorte de bogue avec UITextView dans iOS 7.0

De toute façon, cela a fonctionné pour moi.

32
Theo Bendixson

Quand iOS7 est sorti pour la première fois, cela m'a tourmenté et j'ai trouvé une réponse dans ce fil de discussion (définir l'attribut de texte de UITextView sur nil avant de définir la valeur réelle a joué le tour). Puis tout à coup, le problème (pour moi c’était toute la chaîne mise en surbrillance comme un lien) s’est refermé (probablement à cause d’une mise à jour iOS).

En fin de compte, le truc pour moi a été d'arrêter d'utiliser l'attribut text et de définir l'attribut attributText. Une fois que j'ai fait cela, la nécessité de définir les polices/défilement/sélectionnable/modifiable/etc. par programme, disparu. J'ai défini mon UITextView dans IB, défini les valeurs à ma guise (non défilables, non modifiables, sélectionnables, détectant les liens et les numéros de téléphone), puis créé une chaîne et un attribut attribués:

myUITextView.attributedString = myAttributedString;

Et soudain, tout a fonctionné comme prévu. J'espère que cela aide quelqu'un d'autre sur la route.

27
Raconteur

J'ai eu le même problème et la désactivation du défilement sur UITextView active la détection de lien au chargement plutôt que de ne fonctionner que lorsque l'utilisateur a interagi avec textview. UITextView devait également être sélectionnable et non modifiable.

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

Être sélectionnable ou avoir le défilement activé n'est pas nécessaire sur iOS6.

Une autre chose à vérifier est que l’interaction de l’utilisateur est activée sur la cellule et la vue de contenu de la cellule, sinon le lien ne sera pas cliquable.

18
svarrall

Vérifiez que ces lignes doivent être ajoutées pour utiliser la propriété de détection de données de textview dans la cellule UItableView.

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

Vous devriez vérifier NSDataDetector.

Vous pouvez l'utiliser pour rechercher et traiter différentes données (liens, numéros de téléphone, etc.). Regardez sur ce site:

http://nshipster.com/nsdatadetector/

Vous pouvez également utiliser la propriété dataDetectorTypes de UITextView pour définir ce que vous souhaitez détecter dans le code. Peut-être juste un problème de transition de storyboard pour vous.

textView.dataDetectorTypes = UIDataDetectorTypeLink;
8
Daniel

Sachez que votre textview ne reconnaîtra les liens que si n'est pas éditable!

Voici un bon tutoriel sur la façon de faire un editable UITextView avec `link detection``

ITextView éditable avec détection de lien

Je n'ai rencontré aucun problème avec cette solution depuis maintenant.

Le truc est un GestureRecognizer pour avertir et activer/désactiver l'édition.

Vous pouvez appliquer la même chose avec le selectable / not selectable numéro sur iOS7

7
Alexander

Après quelques tests, j'ai trouvé une solution.

Si vous souhaitez que les liens soient actifs et que la sélection ne soit pas activée, vous devez modifier gestureRecognizers.

Par exemple, il existe 3 LongPressGestureRecognizers. Un pour cliquer sur le lien (minimumPressDuration = 0,12), un deuxième pour un zoom en mode éditable (minimumPressDuration = 0,5), un troisième pour la sélection (minimumPressDuration = 0,8). Cette solution supprime LongPressGestureRecognizer pour la sélection et second pour le zoom en mode édition.

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;

Testé sur iOS 9, mais il devrait fonctionner sur toutes les versions (iOS 7, 8, 9). J'espère que ça aide! :)

5
Kubík Kašpar

J'ai trouvé le truc, ça marche sous iOS 7!

Vous devez définir la UITextView sélectionnable dans votre xib ou par programme

self.yourTextView.selectable = YES;

et puis vous devez désactiver les parchemins et réactiver après avoir défini votre texte.

self.yourTextView.scrollEnabled = NO;
[self.yourTextView setText:contentString];
self.yourTextView.scrollEnabled = YES;
4
Álvaro Murillo

Donc, utiliser un UITextView pour le garder activé, sélectionnable, non défilable et les liens détectables n'est pas aussi simple qu'il y paraît. J'ai rencontré cela dans iOS 8. Ma solution a donc été de procéder de la sorte dans viewDidLoad, puis de définir la propriété modifiable sur NO lorsque l'édition de la zone de texte est effectuée (ce serait généralement une méthode comme doneIsTapped). L'astuce consiste à définir la propriété modifiable sur NO une fois que la définition de la valeur du texte sur textview est terminée. Cela activera les liens dans UITextview.

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

et

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

cela a rendu les liens activés dans textview. Aussi, je recommanderais de ne pas utiliser de story board pour le moment (ou avant Apple corrige ce problème) et d'utiliser simplement du code pour éviter toute confusion inutile. J'espère que cela vous aidera.

4
skypirate

Changer la couleur de teinte en une autre couleur fonctionne réellement. Toutefois, si cette option est activée, la teinte sera également de la même couleur.

2
Desmond

La désactivation de la fonction de défilement UITextViews m'a permis de réussir dans une configuration similaire.

2
Tharagon

Définissez la propriété de défilement de UITextView sur Non, cela fonctionnera ... Self.textView.ScrollingEnable = NO;

1
Shaheen Rehman

Cette solution fonctionne pour moi:

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;
    }
}
0
Andrey Soloviev

Si vous ajoutez UITextview par programme, ajoutez simplement les lignes ci-dessous:

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

Cela a fonctionné pour moi.

0
Maishi Wadhuwani

Bien que ce fil de discussion soit ancien, je n'ai pas vu de réponse qui fonctionne pour moi avec Swift, alors voici pour Swift 2.2

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

Aucun de ce qui précède n'a fonctionné pour moi, j'ai plutôt fait ceci:

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

C'est ce que j'ai fait avec ma vue de texte censée détecter tous les types et dont les couleurs non détectées étaient définies en blanc. Vous pouvez modifier le code pour représenter votre couleur et le type de lien à détecter.

0
Tunde