J'ai un UITextView
qui affiche un NSAttributedString
. Cette chaîne contient des mots que j'aimerais rendre tapables, de sorte que lorsqu'ils sont tapés, je suis rappelé afin que je puisse effectuer une action. Je me rends compte que cela UITextView
peut détecter les tapotements sur une URL et rappeler mon délégué, mais ce ne sont pas des URL.
Il me semble qu'avec iOS 7 et la puissance de TextKit, cela devrait maintenant être possible, mais je ne trouve aucun exemple et je ne sais pas par où commencer.
Je comprends qu'il est maintenant possible de créer des attributs personnalisés dans la chaîne (bien que je ne l'ai pas encore fait), et peut-être que ceux-ci seront utiles pour détecter si l'un des mots magiques a été tapé? Dans tous les cas, je ne sais toujours pas comment intercepter ce tap et détecter sur quel mot le tap s'est produit.
Notez que la compatibilité iOS 6 n'est pas requise.
la source
Détecter les tapotements sur le texte attribué avec Swift
Parfois, pour les débutants, il est un peu difficile de savoir comment mettre en place les choses (c'était pour moi en tout cas), donc cet exemple est un peu plus complet.
Ajoutez un
UITextView
à votre projet.Sortie
Connectez le
UITextView
auViewController
avec une prise nomméetextView
.Attribut personnalisé
Nous allons créer un attribut personnalisé en créant une extension .
Ajoutez un nouveau fichier Swift avec Fichier> Nouveau> Fichier ...> iOS> Source> Fichier Swift . Vous pouvez l'appeler comme vous le souhaitez. J'appelle le mien NSAttributedStringKey + CustomAttribute.swift .
Collez le code suivant:
Code
Remplacez le code dans ViewController.swift par ce qui suit. Notez le
UIGestureRecognizerDelegate
.Maintenant, si vous appuyez sur le "w" de "Swift", vous devriez obtenir le résultat suivant:
Remarques
NSAttributedString.Key.foregroundColor
(couleur du texte) qui a une valeur deUIColor.green
.Une étude plus approfondie
Cette réponse était basée sur plusieurs autres réponses à cette question. Outre ceux-ci, voir aussi
la source
myTextView.textStorage
place demyTextView.attributedText.string
Il s'agit d'une version légèrement modifiée, basée sur la réponse @tarmes. Je ne pouvais pas obtenir la
value
variable pour retourner quoi que ce soit, maisnull
sans le réglage ci-dessous. De plus, j'avais besoin du dictionnaire d'attributs complet renvoyé afin de déterminer l'action résultante. J'aurais mis cela dans les commentaires mais je ne semble pas avoir le représentant pour le faire. Je m'excuse à l'avance si j'ai violé le protocole.Un ajustement spécifique consiste à utiliser à la
textView.textStorage
place detextView.attributedText
. En tant que programmeur iOS toujours en apprentissage, je ne sais pas vraiment pourquoi, mais peut-être que quelqu'un d'autre peut nous éclairer.Modification spécifique de la méthode de gestion des prises:
Code complet dans mon contrôleur de vue
la source
Créer un lien personnalisé et faire ce que vous voulez sur le robinet est devenu beaucoup plus facile avec iOS 7. Il y a un très bon exemple chez Ray Wenderlich
la source
UITextView
ne détectait pas les liens même lorsque je l'avais configuré pour les détecter via IB. (Je l'avais également rendu non sélectionnable)Exemple WWDC 2013 :
la source
J'ai pu résoudre ce problème assez simplement avec NSLinkAttributeName
Swift 2
la source
if URL.scheme == "cs"
et enreturn true
dehors de laif
déclaration afin que leUITextView
puisse gérer leshttps://
liens normaux qui sont exploitésExemple complet pour détecter les actions sur le texte attribué avec Swift 3
Et puis vous pouvez attraper l'action avec la
shouldInteractWith URL
méthode de délégué UITextViewDelegate.Assurez-vous donc que vous avez correctement défini le délégué.De même, vous pouvez effectuer n'importe quelle action en fonction de vos besoins.
À votre santé!!
la source
C'est possible de faire ça avec
characterIndexForPoint:inTextContainer:fractionOfDistanceBetweenInsertionPoints:
. Cela fonctionnera un peu différemment de ce que vous vouliez - vous devrez tester si un caractère tapé appartient à un mot magique . Mais ça ne devrait pas être compliqué.BTW, je recommande vivement de regarder Introducing Text Kit de WWDC 2013.
la source
Avec Swift 5 et iOS 12, vous pouvez créer une sous-classe de
UITextView
et remplacerpoint(inside:with:)
avec une implémentation de TextKit afin de n'en rendre qu'une partieNSAttributedStrings
exploitable.Le code suivant montre comment créer un
UITextView
qui ne réagit qu'aux tapotements sur lesNSAttributedString
s soulignés :InteractiveUnderlinedTextView.swift
ViewController.swift
la source
Celui-ci pourrait fonctionner correctement avec un lien court, un lien multiple dans une vue de texte. Cela fonctionne bien avec iOS 6,7,8.
la source
Utilisez cette extension pour Swift:
Ajoutez
UITapGestureRecognizer
à votre vue de texte avec le sélecteur suivant:la source