Comment intercepter cliquez sur le lien dans UITextView?
Est-il possible d'effectuer une action personnalisée lorsque l'utilisateur touche autodétecté téléphone lien dans UITextView. Merci de ne pas les conseils d'utilisation UIWebView à la place.
Et merci de ne pas juste répétez le texte à partir d'apple classes de référence
- certainement, je l'ai déjà lu.
Grâce.
Vous devez vous connecter pour publier un commentaire.
Mise à jour: à Partir de ios10,
À partir de ios7 et plus Tard
UITextView
a la méthode du délégué:pour intercepter les clics des liens. Et c'est la meilleure façon de le faire.
Pour ios6 et le plus tôt une belle façon de le faire est par le sous-classement
UIApplication
et d'écraser le-(BOOL)openURL:(NSURL *)url
Vous aurez besoin de mettre en œuvre
openURL:
dans votre délégué.Maintenant, pour avoir le démarrage de l'application avec votre nouvelle sous-classe de
UIApplication
, recherchez le fichier principal.m dans votre projet. Dans ce petit fichier qui démarre votre application, il est généralement de cette ligne:Le troisième paramètre est le nom de la classe pour votre application. Ainsi, le remplacement de cette ligne pour:
Cela a fait l'affaire pour moi.
UIApplication
et remplacer l'openURL mise en œuvre. Bien que de cette manière, il est difficile (mais pas impossible) de référence à la mise en œuvre d'origine.textView:shouldInteractWithURL:inRange
est obsolète.Dans iOS 7 ou version Ultérieure
Vous pouvez utiliser les éléments suivants UITextView délégué Méthode:
L'affichage de texte appelle cette méthode si l'utilisateur appuie ou long-presses de l'adresse URL du lien. La mise en œuvre de cette méthode est facultative. Par défaut, l'affichage de texte s'ouvre l'application, responsable de traitement, le type d'URL et transmet l'URL. Vous pouvez utiliser cette méthode pour déclencher une action de substitution, telles que l'affichage du contenu web à l'adresse URL dans un affichage web, au sein de l'application en cours.
Important:
UIWebView
si vous voulez faire un autre texte le lien et non l'URL elle-même. Le<a>
balise est toujours la meilleure voie à suivre dans ce cas.Swift version:
Votre standard UITextView le programme d'installation devrait ressembler à quelque chose comme cela, n'oubliez pas le délégué et dataDetectorTypes.
Après votre classe se termine ajouter ce morceau:
Pour Swift 3
ou si la cible est >= IOS 10
Avec Swift 5 et iOS 12, vous pouvez utiliser l'un des trois modèles suivants afin d'interagir avec des liens dans un
UITextView
.#1. À l'aide de
UITextView
'sdataDetectorTypes
propriété.La façon la plus simple d'interagir avec les numéros de téléphone, des adresses url ou des adresses dans un
UITextView
est d'utiliserdataDetectorTypes
de la propriété. L'exemple de code ci-dessous montre comment la mettre en œuvre. Avec ce code, lorsque l'utilisateur appuie sur le numéro de téléphone, unUIAlertController
pop-up.#2. À l'aide de
UITextViewDelegate
'stextView(_:shouldInteractWith:en:interaction:)
méthodeSi vous souhaitez effectuer une certaine action personnalisée au lieu de faire un
UIAlertController
pop-up lorsque vous appuyez sur un numéro de téléphone lors de l'utilisationdataDetectorTypes
, vous avez pour faire de votreUIViewController
conforme àUITextViewDelegate
protocole et de mettre en œuvretextView(_:shouldInteractWith:in:interaction:)
. Le code ci-dessous montre comment la mettre en œuvre:#3. À l'aide de
NSAttributedString
etNSAttributedString.Key.link
Comme alternative, vous pouvez utiliser
NSAttributedString
et de définir unURL
pour sonNSAttributedString.Key.link
attribut.L'exemple de code ci-dessous montre une possible mise en œuvre. Avec ce code, lorsque l'utilisateur appuie sur l'attribuée à cordes, uneUIAlertController
pop-up.Je n'ai pas essayé moi-même, mais vous pouvez essayer de mettre en œuvre
application:handleOpenURL:
méthode dans votre application délégué - elle ressemble à toutes lesopenURL
demande de passer par ce rappel.Pas sûr de savoir comment vous permettrait d'intercepter la détection de liaison de données, ou quel type de fonction, vous devez exécuter. Mais vous pouvez être en mesure d'utiliser le didBeginEditing TextField méthode pour exécuter un test/analyse par le biais de la zone de texte si vous savez ce que vous cherchez..tels que la comparaison des chaînes de texte qui répondent ###-###-#### format, ou de commencer avec "www." pour récupérer ces champs, mais vous devez écrire un peu de code à renifler, à travers les objets textfield chaîne, reconize ce dont vous avez besoin, puis l'extraire de votre fonction de l'utilisation. Je ne pense pas que ce serait si difficile, une fois que vous avez rétréci vers le bas exactement ce que tu voulais et ensuite porté à votre si() déclaration des effets très spécifiques qui correspondent au motif de ce que vous avez besoin.
De couse cela implique que l'utilisateur va toucher la zone de texte pour activer le didBeginEditing(). Si ce n'est pas le type de l'interaction de l'utilisateur que vous recherchez, vous pouvez simplement utiliser un trigger Timer, qui commence sur ViewDidAppear() ou autre, fondée sur les besoins et les pistes à travers les objets textfield chaîne, puis à la fin de l'exécution à travers la zone de texte chaîne de méthodes que vous avez construit, vous venez de tourner la Minuterie marche arrière.
application:handleOpenURL:
est appelée lorsqu'une autre application s'ouvre votre application par l'ouverture d'une URL avec un schéma de votre application prend en charge. Il n'est pas appelé lorsque votre application commence l'ouverture d'une URL.Je pense que la seule façon de faire ce que Vladimir veut, c'est d'utiliser une UIWebView au lieu d'un UITextView. Faire de votre point de vue contrôleur de mettre en œuvre UIWebViewDelegate, définir la UIWebView du délégué à la vue du contrôleur, et de l'avis du contrôleur de mettre en œuvre
webView:shouldStartLoadWithRequest:navigationType:
pour ouvrir[request URL]
dans une vue au lieu de cesser de votre application et de l'ouvrir dans le navigateur Safari Mobile.Swift 4:
1) Créer la classe suivante (sous-classé UITextView):
2) Lorsque vous configurez votre textview, ce faire:
Si vous utilisez la table de montage séquentiel, assurez-vous que votre textview ressemble à ceci dans le volet de droite de l'identité de l'inspecteur:
Voila! Maintenant, vous obtenez le lien appuyez immédiatement au lieu d'lorsque l'URL shouldInteractWith URL méthode
hitTest
est appelé deux fois